This is the evaluation of the experiment’s results. The focus of this notebook is on answering the research question by conducting a factorial multivariate analysis of variance (MANOVA) on the foundation of the measurement model which has been validated previously using an ordinal confirmatory factor analysis (CFA).

This notebook expands the master thesis by data analysis and respective code as well as short explanations. This markdown does not replace the thesis, it serves solely as an appendix.

Library Downloads

library(tidyverse)
library(broom)
library(ggplot2)
library(dplyr)
library(finalfit)
library(mice)
library(miceadds)
library(MASS)
library(lavaan)
library(lavaan.mi)
library(semptools)
library(semTools)
library(psych)
library(corrplot)
library(purrr)
library(TAM)
library(DescTools)
library(gridExtra)
library(cowplot)
library(ggpubr)
library(rstatix)
library(mvnormalTest)
library(biotools)
library(car)
library(effectsize)
library(emmeans)

Sample Load and Data Preparation

First, the previously imputed data is loaded as a mids object:

getwd()
[1] "/Users/lara-aidajopp/Documents/Programming_Stuff/Universität Mannheim/Masterthesis/evaluation"
final_imputed_data <- read_rds("data/mi_mids_object.rds")
glimpse(final_imputed_data[1])
List of 1
 $ data:'data.frame':   131 obs. of  26 variables:
  ..$ NEW CASE NR: num [1:131] 1 2 3 4 5 6 7 8 9 10 ...
  ..$ SD01       : num [1:131] 1 2 2 1 1 1 1 2 1 1 ...
  ..$ SD02       : num [1:131] 11 2 2 5 2 8 5 2 3 4 ...
  ..$ SD04       : num [1:131] 5 7 6 11 10 6 5 10 9 11 ...
  ..$ SD05       : num [1:131] 7 2 6 5 4 4 4 4 6 4 ...
  ..$ TR01_CP    : num [1:131] 2 2 3 3 4 4 5 5 5 6 ...
  ..$ TR01       : num [1:131] 3 2 1 2 2 1 4 1 3 2 ...
  ..$ AC01_01    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 5 5 5 4 5 4 3 ...
  ..$ AC01_02    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 4 5 4 NA 4 4 4 ...
  ..$ AC01_03    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 4 2 5 4 5 4 4 ...
  ..$ DI01_01    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 4 4 3 5 4 4 NA 5 ...
  ..$ DI01_02    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 1 5 NA 5 NA ...
  ..$ DI01_03    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 1 5 NA 5 NA ...
  ..$ DI01_04    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 1 1 1 1 NA NA 4 3 ...
  ..$ UI01_01    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 4 5 4 5 5 5 3 5 ...
  ..$ UI01_02    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 4 5 5 5 4 5 4 5 4 5 ...
  ..$ UI01_03    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 3 NA NA 4 NA NA 4 3 5 ...
  ..$ UI01_04    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 1 1 1 1 NA NA 2 1 ...
  ..$ EX01_01    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 3 3 NA 2 NA 5 4 4 ...
  ..$ EX01_02    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 3 1 4 2 NA 2 2 2 ...
  ..$ EX01_03    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 3 1 NA 2 NA 2 2 1 ...
  ..$ EX01_04    : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 2 4 1 4 NA ...
  ..$ STARTED    : POSIXct[1:131], format: "2025-09-26 14:11:10" "2025-09-26 15:13:01" ...
  ..$ LASTDATA   : POSIXct[1:131], format: "2025-09-26 14:16:16" "2025-09-26 15:21:43" ...
  ..$ TIME_SUM   : num [1:131] 306 430 369 555 445 309 749 318 277 959 ...
  ..$ FINISHED   : num [1:131] 1 1 1 1 1 1 1 1 1 1 ...

As MANOVA is a parametric method that is applied to analyze differences between multiple, continuous dependent variables, the means for each factor of the four factors are calculated first (Kang and Jin, 2016). Although, the calculation of the mean on the basis of an ordinal scale necessitates “a collection of purposefully constructed items” [p. 109] on the macro scale (Carifio and Perla, 2007). On the basis of this measurement scale perspective, means as parametric statistical structures can be constructed on the foundation of the items assigned to the purposeful factors (Carifio and Perla, 2007). These factors are verified in their purpose through the previously conducted ordinal CFA. Consequently, the following measurement model serves as a basis for the following mean calculation per factor:

First, the items of the measurement model and the treatment variable TR01, which depicts the independent variable (Kaltenbach, 2021), must be extracted of the imputed data:

factor_relevant_cols <- c("AC01_01", "AC01_02", "AC01_03", 
                             "DI01_02", "DI01_03", "DI01_04", "EX01_04",
                             "UI01_01", "UI01_02", 
                             "EX01_02", "EX01_03", "UI01_04")
treatment_col <- c("TR01")
total_cols <- c(factor_relevant_cols, treatment_col)

list_of_fac_rel_cols <- lapply(complete(final_imputed_data, "all"), function(df) df[, total_cols])

glimpse(list_of_fac_rel_cols[1])
List of 1
 $ 1:'data.frame':  131 obs. of  13 variables:
  ..$ AC01_01: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 5 5 5 4 5 4 3 ...
  ..$ AC01_02: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 4 5 4 2 4 4 4 ...
  ..$ AC01_03: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 4 2 5 4 5 4 4 ...
  ..$ DI01_02: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 1 5 1 5 1 ...
  ..$ DI01_03: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 1 5 1 5 2 ...
  ..$ DI01_04: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 1 1 1 1 5 2 4 3 ...
  ..$ EX01_04: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 2 4 1 4 1 ...
  ..$ UI01_01: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 4 5 4 5 5 5 3 5 ...
  ..$ UI01_02: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 4 5 5 5 4 5 4 5 4 5 ...
  ..$ EX01_02: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 3 1 4 2 2 2 2 2 ...
  ..$ EX01_03: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 3 1 2 2 4 2 2 1 ...
  ..$ UI01_04: Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 1 1 1 1 5 3 2 1 ...
  ..$ TR01   : num [1:131] 3 2 1 2 2 1 4 1 3 2 ...

In addition, four new columns are introduced for each factor in which the calculated mean is stored for each imputed dataset. These four resulting additional variables depicted as value columns are the dependent variables to be conducted (Kang and Jin, 2016; Kaltenbach, 2021):

list_factor_mean_cols <- lapply(list_of_fac_rel_cols, function(df) {
    df %>%
      mutate(
        across(all_of(factor_relevant_cols), ~as.integer(.x)),
        AC01_SCORE = round(rowMeans(across(c("AC01_01", "AC01_02", "AC01_03")), na.rm = TRUE), 2),
        DI01_SCORE = round(rowMeans(across(c("DI01_02", "DI01_03", "DI01_04", "EX01_04")), na.rm = TRUE), 2),
        UI01_SCORE = round(rowMeans(across(c("UI01_01", "UI01_02")), na.rm = TRUE), 2),
        EX01_SCORE = round(rowMeans(across(c("EX01_02", "EX01_03", "UI01_04")), na.rm = TRUE), 2),
        across(all_of(factor_relevant_cols), ~as.ordered(.x)),
        across(all_of(treatment_col), ~as.factor(.x))
      ) %>%
        rename(treatment = TR01)
})

list_factor_mean_cols[1]
$`1`
NA

For an improved clarity of the latter visual analysis of the descriptive statistics (boxplots) as well as the (M)ANOVA investigations, the treatment column is recoded (1 = Vanilla, 2 = CoT, 3 = RAG, 4 = CoTxRAG). Therefore, another list “analysis_list_factor_mean_cols” is created upon the by means expanded original list of imputed datasets “list_factor_mean_cols”.

analysis_list_factor_mean_cols <- lapply(list_factor_mean_cols, function(df) {
    df %>%
        mutate(
        treatment = case_match(
          treatment, 
          "1" ~ "Vanilla",
          "2" ~ "CoT",
          "3" ~ "RAG",
          "4" ~ "CoTxRAG",
          .default = as.character(treatment)
          ),
        treatment = factor(
          treatment,
          levels = c("Vanilla", "CoT", "RAG", "CoTxRAG")
        )
        )
      
})

analysis_list_factor_mean_cols[1]
$`1`
NA

This transformed and by means expanded list of the imputed factor items has to be transformed back into an mids object for the latter post-check factorial ANOVA which can be applied to mira objects (Robitzsch et al., 2025). As stated before for the ordinal CFA, using the mids object ensures that the standard errors as well as further statistical measures influenced by multiple imputation are considered in terms of a mira object (Van Buuren, 2011).

mids_analysis_factor_mean_cols <- datlist2mids(analysis_list_factor_mean_cols)
glimpse(mids_analysis_factor_mean_cols[1])
List of 1
 $ data:'data.frame':   131 obs. of  17 variables:
  ..$ AC01_01   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 5 5 5 4 5 4 3 ...
  ..$ AC01_02   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 4 5 4 NA 4 4 4 ...
  ..$ AC01_03   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 4 5 4 2 5 4 5 4 4 ...
  ..$ DI01_02   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 1 5 1 5 NA ...
  ..$ DI01_03   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 1 5 NA 5 NA ...
  ..$ DI01_04   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 1 1 1 1 NA NA 4 3 ...
  ..$ EX01_04   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 1 1 1 2 4 1 4 NA ...
  ..$ UI01_01   : Ord.factor w/ 4 levels "2"<"3"<"4"<"5": 4 3 3 4 3 4 4 4 2 4 ...
  ..$ UI01_02   : Ord.factor w/ 4 levels "2"<"3"<"4"<"5": 3 4 4 4 3 4 3 4 3 4 ...
  ..$ EX01_02   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 3 1 4 2 NA 2 2 2 ...
  ..$ EX01_03   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 1 3 1 NA 2 NA 2 2 1 ...
  ..$ UI01_04   : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 5 2 1 1 1 1 NA NA 2 1 ...
  ..$ treatment : Factor w/ 4 levels "Vanilla","CoT",..: 3 2 1 2 2 1 4 1 3 2 ...
  ..$ AC01_SCORE: num [1:131] 5 4 5 4.33 4 4.67 NA 4.67 4 3.67 ...
  ..$ DI01_SCORE: num [1:131] 5 1.25 1 1 1 1.25 NA NA 4.5 NA ...
  ..$ UI01_SCORE: num [1:131] 4.5 4.5 4.5 5 4 5 4.5 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:131] 5 1.67 2.33 1 NA 1.67 NA NA 2 1.33 ...

Descriptive Statistics

Before starting the MANOVA analysis, the initial step relies in analyzing the descriptive statistics (Kang and Jin, 2016). First, boxplots are generated to establish a foundation for an advanced analysis using descriptive statistic measures such as mean and its lower and upper confidence intervals. This overall descriptive analysis lays the ground for the MANOVA analysis.

Interpretating the Overall Tendency with Boxplots

Boxplots are generated for pre-evaluating tendencies such as median differences among treatment groups (Von Eye and Wiedermann, 2023), which are deeper analyzed using the later on calculated descriptive static metrics, e.g., the mean. For clarity reasons, the list “analysis_list_factor_mean_cols” in which the treatment column is recoded (1 = Vanilla, …) is used.

First, for each imputed dataset the plots are generated. However, to avoid analyzing 10 different but similar plots for each dependent variable, all 10 imputed datasets are summarized into one for a quick exploration. The resulting four summary boxplots are arranged and analyzed together. As the later depicted table serves as a more detailed descriptive statistic, the accompanying blurring of the boxplots is acknowledged and accepted. Moreover, boxplots are intended to explore the median, quartiles, minimum and maximum values and thus, the overall tendency of the data but not SEs and other statistical measures that are impacted by the procedure of multiple imputation (Van Buuren, 2011; Seltman, 2018).

ac01_plot <- lapply(analysis_list_factor_mean_cols, function(df) {
  ggplot(df, aes(treatment, AC01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) + geom_jitter(width = 0.2) + ylim(1, 5)
})

ac01_plot
$`1`

$`2`

$`3`

$`4`

$`5`

$`6`

$`7`

$`8`

$`9`

$`10`

di01_plot <- lapply(analysis_list_factor_mean_cols, function(df) {
  ggplot(df, aes(treatment, DI01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) + geom_jitter(width = 0.2) + ylim(1, 5)
})

di01_plot
$`1`

$`2`

$`3`

$`4`

$`5`

$`6`

$`7`

$`8`

$`9`

$`10`

ui01_plot <- lapply(analysis_list_factor_mean_cols, function(df) {
  ggplot(df, aes(treatment, UI01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) + geom_jitter(width = 0.2) + ylim(1, 5)
})

ui01_plot
$`1`

$`2`

$`3`

$`4`

$`5`

$`6`

$`7`

$`8`

$`9`

$`10`

ex01_plot <- lapply(analysis_list_factor_mean_cols, function(df) {
  ggplot(df, aes(treatment, EX01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) + geom_jitter(width = 0.2) + ylim(1, 5)
})

ex01_plot
$`1`

$`2`

$`3`

$`4`

$`5`

$`6`

$`7`

$`8`

$`9`

$`10`

analysis_summary_df <- bind_rows(analysis_list_factor_mean_cols)

sum_ac01_plot <- ggplot(analysis_summary_df, aes(treatment, AC01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) +  geom_jitter(width = 0.2) + ylim(1, 5)

sum_di01_plot <- ggplot(analysis_summary_df, aes(treatment, DI01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) + geom_jitter(width = 0.2) + ylim(1, 5)

sum_ui01_plot <- ggplot(analysis_summary_df, aes(treatment, UI01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) + geom_jitter(width = 0.2) + ylim(1, 5)

sum_ex01_plot <- ggplot(analysis_summary_df, aes(treatment, EX01_SCORE, color=treatment)) + geom_boxplot() + stat_boxplot(geom='errorbar',coef=5) + geom_jitter(width = 0.2) + ylim(1, 5)


sum_of_all <- ggarrange(sum_ac01_plot, sum_di01_plot, sum_ui01_plot, sum_ex01_plot, ncol=2, nrow=2, common.legend = TRUE, legend = "right")
sum_of_all

As the questionnaire only allows to answer on a Likert scale 1-5 ordinal response format with 1 indicating the highest disagreement and 5 in reverse, the medians and values interpreted below are rounded, i.e., 2.5 ≈ 3.

For the dependent variable of accountability (AC01_SCORE), a common median of 4 is observed. This indicates that all treatments are likely to achieve a high accountability from a user point of view, i.e., all treatments interact with the user in a rather neutral, believing, and rule-accompanying way. However, for CoT and CoTxRAG the minimum value significantly disagrees referring to a tiny share of users do not agree to the median at all. For all four treatments, the values are concentrated around 4 (3 - 5) - which overall agress with the median.

The second dependent variable, disclosure (DI01_SCORE), varies broadly compared to the prior outlined variable as the median of RAG and CoTxRAG is 4 whereas Vanilla’s and CoT’s median is 1. Accordingly, RAG-based treatments are more likely to be perceived as disclosing sources and additional content than Vanilla or CoT treatments. However, a maximum value of 5 for the latter both indicate that it is not unlikely at all that those two treatments are perceived disclosing, too. In contrast, RAG’s and CoTxRAG’s minimum values are 2 and 3 indicating that users are very likely to perceive those treatments at least a bit disclosing. To conclude, the values for Vanilla and CoT are less dispersed than the values for RAG and CoTxRAG referring a higher agreement among respondents of the latter two treatments.

Usefulness of information (UI01_SCORE) as the third dependent variable, achieves a higher agreement across all four treatments with a median of 5 and a similar dispersion of values of 3 - 5. Consequently, all users are likely to agree that all treatment’s lead to useful information that contains the most important points of a user’s request in an understandable way.

Finally, the tendency of the last dependent variable of explainability (EX01_SCORE) is conducted. Here again more varying medians are observed as all treatments have a median of 2 except for CoTxRAG which inherits a median of 3. Similar to disclosure that values are spread across all possible values 1 - 5. Although the maximum value of CoT which is 4 indicates that CoT is more likely to be perceived less explainable than the others, i.e., allowing to trace its argumentation and to react on the user’s demands. In contrast to the others, CoTx RAG is more spread around 3 which explains its higher median. Consequently, it is more likely to be perceived more explainable than the other treatments. It has to be nouned that a value of 3 indicates neither a high nor a low explainability. Thereby, even though CoTxRAG is more likely to have a higher explainablility than the other treatments, it is likely to be only moderately explainable in the end.

Calculation and Interpretation of Descriptive Statistic Metrics

Based on the previous outcomes, we analyze the descriptive statistic metrics. Hereby, a significance level alpha of 0.05 is assumed. We start with depicting a table that contains descriptive information of each factor:

The metrics are determined in two steps in order to take the properties of the imputed data into account. Whereas the N of each treatment can be determined by simply counting the rows of a treatment, the mean and SD are ascertained by using a method of the “miceadds” package that allows to directly calculate these metrics on the foundation of imputed data (Robitzsch et al., 2025). Mean and SD establish the ground for further metric calculations, i.e., the second step. However, Robitzsch et al. (2025) do not mention in which way the SE, confidence intervals and p values of the multiple imputation is considered. As the method suggested by Robitzsch et al. (2025) is primarly used for weighted datasets, we assume that the impact of multiple imputation on the prior mentioned metrics is not considered fully.

The variance is calculated on the basis of the SD as the SD is the quadratic square root of the variance. Moreover, the SE is calculated by dividing the SD by the square root of a treatment’s N. The lower and upper confidence intervals can be ascertained by subtracting/adding the multiplication of the z-scores of “the 2.5% and 97.5% quantiles of a standard normal distribution [+- 1.96]” (Kaltenbach, 2021, p. 25) with the SE. (Kaltenbach, 2021)

Furthermore, two additional central tendency metrics are calculated: median and mode. The median “splits the distribution in half […] [with a 50 %] chance of a random value […] occurring above or below the median.” (Seltman, 2018, p. 37). Even though this is a common metric, the mean is the more frequently used metric for central tendency depicting the “(expected value) of a random variable” (Seltman, 2018, p. 37). In contrast to these two metrics, the mode as “the most […] frequently occurring value” (Seltman, 2018, p. 68) is rather seldom used in practice. All these metrics establish a holistic picture on each treatments central tendency and thus, are calculated below. (Seltman, 2018)

The minimum and maximum values of each treatment are also provided to show the maximum the dispersion of values.

For the calculation of median, mode and min/max values, Rubin’s rules of pooling are not considered as no predefined function that takes imputed data properties into account is used (Van Buuren, 2011), e.g., as functions of the “miceadds” package (Robitzsch et al., 2025). But as those metrics are only used for interpreting the descriptive statistics and not ongoingly, this limitation is acknowledged and accepted. The metrics are calculated for a combined dataset consisting of all rows of each imputed dataset for each treatment, i.e., if a treatment occurs 36 times, it has 36 rows per imputed dataset - as 10 imputed datasets are constructed, 360 rows are considered for median, mode, min/max calculation.

As a foundation the list “list_factor_mean_cols” of imputed dataset is used as an encoded treatment, i.e., 1:4 instead of “Vanilla”:“CoTxRAG”, decreases the potential for errors due to type differences, e.g., character to double.

relevant_vars = c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")

initial_descriptive_stats <- map_dfr(1:4, function(current_treatment) {
  
  treatment_subset <- lapply(
    list_factor_mean_cols, 
    function(df) df %>%
      dplyr::filter(treatment == current_treatment) %>%
        dplyr::select(treatment, AC01_SCORE, DI01_SCORE, UI01_SCORE, EX01_SCORE)
  )
  
  glimpse(treatment_subset)
  
  # Transforming the subset list into a mids for followup methods (ma.wtd.)
  mids_treatment_subset <- datlist2mids(treatment_subset)
  
  # Checking the N
  N_of_each_treatment_per_imp <- sapply(treatment_subset, nrow)
  N <- mean(N_of_each_treatment_per_imp)

  # Determining the metrics
  mean <- round(ma.wtd.meanNA(
    mids_treatment_subset, vars = relevant_vars), 2)
  SD <- round(ma.wtd.sdNA(mids_treatment_subset, vars = relevant_vars), 2)
  variance <- round((SD * SD), 2)
  SE <- round((SD / sqrt(N)), 2)
  lower_CI <- round((mean - 1.96 * SE), 2)
  upper_CI <- round((mean + 1.96 * SE), 2)
  
  
  # Combine all rows of each of the 10 imputed datasets into one dataset for each treatment to calculate median, mode, max, min value
  treatment_subset_combined <- bind_rows(treatment_subset)
  glimpse(treatment_subset_combined)
  
  # Calculate median value
  treatment_median <- treatment_subset_combined %>% 
    summarise(
      across(
        all_of(relevant_vars), list(median = ~median(.x))
      )
    )
    transponed_median <- as.data.frame(t(treatment_median))
    colnames(transponed_median) <- c("median")
  
  # Calculate mode value
  treatment_mode <- treatment_subset_combined %>% 
    summarise(
      across(
        all_of(relevant_vars), list(mode = ~Mode(.x))
      )
    )
    transponed_mode <- as.data.frame(t(treatment_mode))
    colnames(transponed_mode) <- c("mode")
  
  
  # Calculate min value
  treatment_min <- treatment_subset_combined %>% 
    summarise(
      across(
        all_of(relevant_vars), list(min_value = ~min(.x))
      )
    )
    transponed_min <- as.data.frame(t(treatment_min))
    colnames(transponed_min) <- c("minimum")
  
  # Calculate max value
  treatment_max <- treatment_subset_combined %>% 
    summarise(
      across(
        all_of(relevant_vars), list(max_value = ~max(.x))
      )
    )
    transponed_max <- as.data.frame(t(treatment_max))
    colnames(transponed_max) <- c("maximum")
  
  # Transforming metrics into the output format of a df
  output_mean <- as.data.frame(mean)
  output_sd <- as.data.frame(SD)
  output_var <- as.data.frame(variance)
  output_n <- as.data.frame(N)
  output_treatment_se <- as.data.frame(SE)
  output_treatment_lower_CI <- as.data.frame(lower_CI)
  output_treatment_upper_CI <- as.data.frame(upper_CI)
  dependent_variable <- relevant_vars

  # Combining the output
  output <- cbind(dependent_variable, output_mean, output_sd, output_var, output_n, output_treatment_se, output_treatment_lower_CI, output_treatment_upper_CI, transponed_median, transponed_mode, transponed_min, transponed_max)
  output$treatment <- current_treatment
  output
  
})
List of 10
 $ 1 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 3.33 3.67 4.33 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1.25 3 4.75 3.5 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 2.33 3 5 3.67 1.33 2.33 1 4 ...
 $ 2 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4.33 3.67 4.67 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1 3 4.75 3.25 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 2 3 5 3.67 1.33 2.33 2 4 ...
 $ 3 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4.33 3.67 4.67 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 2.25 3 4.75 3.25 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 3 3 5 2.33 1.33 2.33 2.33 4 ...
 $ 4 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4 3.67 4.33 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1 3 4.75 3 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 1.67 3 5 3.67 1.33 2.33 1 4 ...
 $ 5 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4.67 3.67 3.67 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1.75 3 4.75 3.25 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 1.67 3 5 3.67 1.33 2.33 2.33 4 ...
 $ 6 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4.67 3.67 4.67 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1.5 3 4.75 2.75 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 2.33 3 5 2.33 1.33 2.33 1.67 4 ...
 $ 7 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4.33 3.67 4.67 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1.5 3 4.75 2.5 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 2.33 3 5 3.67 1.33 2.33 1.67 4 ...
 $ 8 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4 3.67 4.33 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1 3 4.75 3.25 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 1.67 3 5 3.67 1.33 2.33 2.33 4 ...
 $ 9 :'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4 3.67 3.67 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1.5 3 4.75 2.25 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 2.67 3 5 3.67 1.33 2.33 2 4 ...
 $ 10:'data.frame': 36 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
  ..$ AC01_SCORE: num [1:36] 5 4.67 4.67 3 4.67 4 3.67 4.67 3.33 4 ...
  ..$ DI01_SCORE: num [1:36] 1 1.25 1.25 3 4.75 3.25 1.25 1.75 1 4 ...
  ..$ UI01_SCORE: num [1:36] 4.5 5 5 3 5 5 4 5 3.5 5 ...
  ..$ EX01_SCORE: num [1:36] 2.33 1.67 3 3 5 3.33 1.33 2.33 1 4 ...
Rows: 360
Columns: 5
$ treatment  <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ AC01_SCORE <dbl> 5.00, 4.67, 4.67, 3.00, 4.67, 3.33, 3.67, 4.33, 3.33, 4.00, …
$ DI01_SCORE <dbl> 1.00, 1.25, 1.25, 3.00, 4.75, 3.50, 1.25, 1.75, 1.00, 4.00, …
$ UI01_SCORE <dbl> 4.5, 5.0, 5.0, 3.0, 5.0, 5.0, 4.0, 5.0, 3.5, 5.0, 5.0, 5.0, …
$ EX01_SCORE <dbl> 2.33, 1.67, 2.33, 3.00, 5.00, 3.67, 1.33, 2.33, 1.00, 4.00, …
List of 10
 $ 1 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 1.75 4.25 1.75 3.25 1.25 1.75 4.75 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2.33 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 2 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 1.5 4 1.75 3.25 1.25 1.75 4.75 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2.33 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 3 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 2.75 4.25 1.75 3.25 1.25 1.75 4.5 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 4 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 3.25 4 1.75 3.25 1.25 1.75 4.5 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2.33 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 5 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 2.25 4.25 1.75 3.25 1.25 1.75 4.75 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2.33 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 6 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 2.5 4 1.75 3.25 1.25 1.75 4.75 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 7 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 2.75 4.25 1.75 3.25 1.25 1.75 3.75 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 8 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 1.5 4.25 1.75 3.25 1.25 1.75 4.75 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2.33 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 9 :'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 2.25 4.25 1.75 3.25 1.25 1.75 4.75 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
 $ 10:'data.frame': 39 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 2 2 ...
  ..$ AC01_SCORE: num [1:39] 4 4.33 4 3.67 4.33 3.67 2.67 4.67 5 4 ...
  ..$ DI01_SCORE: num [1:39] 1.25 1 1 1.75 4.25 1.75 3.25 1.25 1.75 4.5 ...
  ..$ UI01_SCORE: num [1:39] 4.5 5 4 5 5 4.5 3 4.5 5 5 ...
  ..$ EX01_SCORE: num [1:39] 1.67 1 2 1.33 3.33 1.67 3.67 1.33 1 1.67 ...
Rows: 390
Columns: 5
$ treatment  <fct> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
$ AC01_SCORE <dbl> 4.00, 4.33, 4.00, 3.67, 4.33, 3.67, 2.67, 4.67, 5.00, 4.00, …
$ DI01_SCORE <dbl> 1.25, 1.00, 1.00, 1.75, 4.25, 1.75, 3.25, 1.25, 1.75, 4.75, …
$ UI01_SCORE <dbl> 4.5, 5.0, 4.0, 5.0, 5.0, 4.5, 3.0, 4.5, 5.0, 5.0, 4.0, 3.5, …
$ EX01_SCORE <dbl> 1.67, 1.00, 2.33, 1.33, 3.33, 1.67, 3.67, 1.33, 1.00, 1.67, …
List of 10
 $ 1 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 2 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 3 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 4 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4.33 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 5 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4.33 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 6 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 7 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 8 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 3 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 9 :'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 3.67 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
 $ 10:'data.frame': 29 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
  ..$ AC01_SCORE: num [1:29] 5 4 2.67 4.33 5 4 4.67 3.33 3.67 4 ...
  ..$ DI01_SCORE: num [1:29] 5 4.5 2.25 4.75 4.5 4.5 5 3.75 3.75 3.75 ...
  ..$ UI01_SCORE: num [1:29] 4.5 3.5 3.5 4.5 5 4 5 4 4 5 ...
  ..$ EX01_SCORE: num [1:29] 5 2 2 1 1.67 4 1 3 4 2.33 ...
Rows: 290
Columns: 5
$ treatment  <fct> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, …
$ AC01_SCORE <dbl> 5.00, 4.00, 2.67, 4.00, 5.00, 4.00, 4.67, 3.33, 3.67, 4.00, …
$ DI01_SCORE <dbl> 5.00, 4.50, 2.25, 4.75, 4.50, 4.50, 5.00, 3.75, 3.75, 3.75, …
$ UI01_SCORE <dbl> 4.5, 3.5, 3.5, 4.5, 5.0, 4.0, 5.0, 4.0, 4.0, 5.0, 5.0, 4.0, …
$ EX01_SCORE <dbl> 5.00, 2.00, 2.00, 1.00, 1.67, 4.00, 1.00, 3.00, 4.00, 2.33, …
List of 10
 $ 1 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3.33 3.67 4.67 3 3.67 1.67 3 4.67 2.67 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.75 4.25 4 4.25 5 4.25 3.25 4 2.5 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 3.5 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 3.67 1.33 3 4 2.33 4 2 2.67 3 2.33 ...
 $ 2 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3 3.67 4.33 3 3.67 1.67 3 4.67 2.67 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.5 4.25 4 4.5 5 4.25 3.25 4 4.25 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 3.5 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 4 1.33 3 4 2.33 3.33 2 2.67 3 2.33 ...
 $ 3 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3.67 3.67 4.67 3 4 1 3 4.67 3.33 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4 4.25 4 4.5 5 4.25 3.25 4 4.5 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 4 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 3 1.33 3 3.67 2.33 4.33 2 2.67 3 2.33 ...
 $ 4 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3.33 3.67 4.67 3 4 1 3 4.67 3.67 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.75 4.25 4 4.5 5 4.25 3.25 4 3.5 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 3.5 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 5 1.33 3 3.67 2.33 4.33 2 2.67 3 2.33 ...
 $ 5 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3.67 3.67 4 3 4.67 1 3 4.67 3.33 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.75 4.25 4 4.5 5 4.25 3.25 4 4.25 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 3.5 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 4.67 1.33 3 4 2.33 4.33 2 2.67 3 2.33 ...
 $ 6 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3.33 3.67 4.67 3 3.33 3 3 4.67 3.33 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.75 4.25 4 4.25 5 4.25 3.25 4 4 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 3 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 5 1.33 3 4 2.33 2.67 2 2.67 3 2.33 ...
 $ 7 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 4 3.67 3.33 3 4.67 3 3 4.67 3.67 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.5 4.25 4 4.25 5 4.25 3.25 4 4.5 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 2.5 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 3.67 1.33 3 3 2.33 3 2 2.67 3 2.33 ...
 $ 8 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3 3.67 4.33 3 3.33 1 3 4.67 4 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.75 4.25 4 4.25 5 4.25 3.25 4 3 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 4 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 4.33 1.33 3 3.67 2.33 4.33 2 2.67 3 2.33 ...
 $ 9 :'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3.67 3.67 4.33 3 4 1 3 4.67 3 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.75 4.25 4 4.5 5 4.25 3.25 4 3 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 2.5 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 3.67 1.33 3 3.67 2.33 4.33 2 2.67 3 2.33 ...
 $ 10:'data.frame': 27 obs. of  5 variables:
  ..$ treatment : Factor w/ 4 levels "1","2","3","4": 4 4 4 4 4 4 4 4 4 4 ...
  ..$ AC01_SCORE: num [1:27] 3.67 3.67 4.67 3 3.33 1 3 4.67 2.67 3.33 ...
  ..$ DI01_SCORE: num [1:27] 4.75 4.25 4 4.5 5 4.25 3.25 4 4.5 4.5 ...
  ..$ UI01_SCORE: num [1:27] 4.5 4 5 4 4.5 3.5 2.5 4.5 5 4 ...
  ..$ EX01_SCORE: num [1:27] 4 1.33 3 2.67 2.33 4.33 2 2.67 3 2.33 ...
Rows: 270
Columns: 5
$ treatment  <fct> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, …
$ AC01_SCORE <dbl> 3.33, 3.67, 4.67, 3.00, 3.67, 1.67, 3.00, 4.67, 2.67, 3.33, …
$ DI01_SCORE <dbl> 4.75, 4.25, 4.00, 4.25, 5.00, 4.25, 3.25, 4.00, 2.50, 4.50, …
$ UI01_SCORE <dbl> 4.5, 4.0, 5.0, 4.0, 4.5, 3.5, 2.5, 4.5, 5.0, 4.0, 4.5, 3.0, …
$ EX01_SCORE <dbl> 3.67, 1.33, 3.00, 4.00, 2.33, 4.00, 2.00, 2.67, 3.00, 2.33, …
initial_descriptive_stats
NA

The above calculated table has to be cleaned up for interpretation. This includes dropping the “…11” column which depicts only one alternative value for mode in row 8. To enhance an user’s understanding, the treatment column is recoded into its descriptions, i.e., 1 = Vanilla, 2 = CoT, 3 = RAG, 4 = CoTxRAG. Besides, the column sequence is restructured for improved clarity in line with the previously outlined sequence.

descriptive_stats <- as.data.frame(initial_descriptive_stats)

# Drop "...11" column
descriptive_stats <- dplyr::select(descriptive_stats, -14)

# Relocate columns
descriptive_stats <- descriptive_stats[, c(1, 13, 5, 2, 7, 8, 6, 9, 10, 3, 4, 11, 12)]

# Recode treatment from numbers into description
descriptive_stats <- descriptive_stats %>%
  mutate(
    treatment = case_match(
      treatment, 
      1 ~ "Vanilla",
      2 ~ "CoT",
      3 ~ "RAG",
      4 ~ "CoTxRAG",
      .default = as.character(treatment)
      )
    )

descriptive_stats

In preparation for interpretation, also a grouping against the dependent variables AC01, DI01, UI01, EX01 by treatment is established.

descriptive_stats <- descriptive_stats %>% 
  mutate(
    dependent_variable = factor(
      dependent_variable,
      levels = c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")
    ),
    treatment = factor(
      treatment,
      levels = c("Vanilla", "CoT", "RAG", "CoTxRAG")
    )
  ) %>%
  arrange(dependent_variable, treatment)

descriptive_stats

Similar as with the interpretation of the boxplots, the metric values are rounded due to their Likert scale ordinal response format ranging from 1 - 5. As we assume that the impact of multiple imputation is not sufficiently considered within the calculation method, we need to assume that both confidence intervals and SEs are broad and higher than depicted. Besides, the SD and not the variance as its square sum is interpreted.

At a first glance, the unbalancedness of the treatments’ N has to be noted which has already been introduced previously. This impacts the latter MANOVA and ANOVAs and cannot be disregarded.

As with the boxplots’ interpretation, we are starting with the dependent variable of accountability (AC01_SCORE). Each treatment shares the same rounded mean of 4 indicating an overall sample tendency towards being likely to perceive a high accountability for each of the treatments. This is underpinned by the lower and upper confidence intervals which are rather narrow. Although, the lower confidence interval ≈ 3.48 of CoTxRAG can lead in at least one out of 95 % cases to a mean of 3. The SEs are close to 0.1 and thus, rather low indicating a precise estimate. As outlined before, the median is around 4. For the mode, Vanilla achieves the highest value with 5, whereas the other treatments remain at 4. This indicates that 5 is the most often chosen rating for Vanilla and thus, that the ratings are spread at least from 3 to 5 as 4 is the mean. The latter is underlined by the previous boxplot observations stating that the values are concentrated around 4. As the SD is below 1, we assume a moderate dispersion of values relative to the mean of 4 - leading rounded to a value of 3 or 5. All treatments share the same maximum value of 5, but only CoT and CoTxRAG have a common minimum value of 1 indicating a different perceived accountability within each treatment group. For Vanilla, this attenuated by a minimum value of 2. Whereas for RAG, the minimum value of 3 indicates a moderate agreement among the respondents of the treatment group.

Continuing with disclosure (DI01_SCORE) where the mean varies significantly from Vanilla and CoT sharing a mean of 2 compared to RAG and CoTxRAG which share a mean of 4. This refers to that users are more likely to associate RAG and/or CoTxRAG as disclosing than Vanilla and CoT. For Vanilla, the lower confidence interval even suggests that a mean of 1 indicating that Vanilla might be perceived as non-disclosing at all is possible. In contrast, the other lower and upper confidence intervals underpin the respective means. The SEs are close to 0.1 and thus, rather low indicating a precise estimate. In line with previous boxplot findings a median of 1 for Vanilla and CoT and a median of 4 for RAG and CoTxRAG is suggested. This is supported by the mode sharing the same values (1 and 4). Higher SDs compared to the SDs of accountability indicate a higher dispersion around the mean, i.e., that values of Vanilla, CoT and RAG differ by +- 1 compared to their mean. Whereas values of CoTxRAG a rather + 1 higher than their mean. All treatments share the same maximum value of 5 indicating a high dispersion for Vanilla and CoT which also share a minimum value of 1. For RAG, the dispersion is a bit lower with a minimum value of 2. In contrast, the respondents of CoTxRAG tend to agree more with a minimum value of 3.

For usefulness (UI01_SCORE), the mean across treatments is rounded to 4 which points out that all treatments being likely perceived as useful. Whereas with the lower confidence interval the mean remains at 4, the upper confidence interval indicates that there is a chance that at least for one out of 95 % cases a mean of 5 can be expected for all treatments. The SE is lower than for the other dependent variables referring that the precision of the estimate is the highest, relatively. A median of 5 for all treatments agrees with the mean, whereas the mode agrees in all except of one treatments - RAG where a mode of 4 is achieved. Consequently, the must a high amount of 4 and 5 ratings for RAG to achieve previous metric values for usefulness. For all treatments the dispersion around the mean is rather low as the values remain rounded at 4. This rather low dispersion around the mean can be transferred to the total dispersion being low, too, as the minimum values are 3 and the maximum values are 5.

In terms of explainability (EX01_SCORE), all means are rounded to 2 except for CoTxRAG which is rounded to 3. For Vanilla and CoT the mean remains at 2 according to their lower and upper confidence intervals. In contrast, the mean of RAG could increase to 3 in line with the upper confidence interval of ≈ 2.91 which is rounded to 3. In reverse for the mean of CoTxRAG which could decrease to 2 according to its lower confidence interval of 2.48 rounded to 2. Compared to the other dependent variables, the SEs are the highest and thus, the estimates are the most imprecise one despite a still high precision (≈ 0.17, ≈ 0.13, ≈ 0.22, ≈ 0.17). The median agrees with the means, i.e., 2 except for CoTxRAG which is 3. Whereas the mode varies as the most frequent value for Vanilla, CoT and RAG is 1 indicating that those three are very likely to be perceived with a low explainability. In contrast, the mode of CoTxRAG is 3, i.e., a moderate explainability is likely to be perceived by the respondents. The SD is moderately high stating a dispersion around the mean of up to a rating difference of 2, e.g., for RAG with a SD ≈ 1.20 indicating a maximum dispersion of values to the rating of 4. A moderately high SD indicates a within group disagreement and thus, a broad dispersion. This is underpinned by minimum and maximum values ranging from at least 1 to 4.

To summarize, the dependent variables of accountability (AC01_SCORE) and usefulness (UI01_SCORE) share similar metric values and dispersion for all treatments. This indicates that all treatments are likely to be perceived the same in terms of accountability and usefulness. Although, for the dependent variables of disclosure (DI01_SCORE) and explainability (EX01_SCORE) the metrics vary. At a first glance, this indicates that at least CoTxRAG achieves a higher rating than the other treatments and thus, is more likely to be perceived more disclosing and explainable. To further elaborate on this effect, a MANOVA is conducted in the following.

Factorial MANOVA

With factorial MANOVA the following null hypothesis are checked (Friedrich, Konietschke and Pauly, 2019):

For each null hypotheses and further statistical test, a significance level alpha of 0.05 is assumed.

To allow for a factorial MANOVA calculation with non-binary factor levels as “Vanilla”, “CoT”, “RAG”, and “CoTxRAG”, an encoding into binary variables is necessary (Navarro and Foxcroft, 2025). As a consequence, we define the following encoding to represent the factorial research design:
Post-Training
Vanilla RAG
Inference Vanilla 00 01
CoT 10 11

As only one inference and post-training method is tested as a treatment, the factors are named as the methods not as the actual factors, i.e., CoT and RAG.

To establish this coding, the mids object is transformed into long list consisting of stacked rows, i.e., instead of 10 separate datasets, one dataset expanded by a column inheriting the imputation number is created (Van Buuren and Groothuis-Oudshoorn, 2011). After coding, the stacked dataset is transformed back into a mids object for further analysis.

analysis_list_factor_mean_cols_coded <- lapply(analysis_list_factor_mean_cols, function(df) {
    df %>%
        mutate(
        CoT = factor(ifelse(treatment %in% c("CoT", "CoTxRAG"), 1, 0),
                 levels = c(0, 1)),
        RAG = factor(ifelse(treatment %in% c("RAG", "CoTxRAG"), 1, 0),
                 levels = c(0, 1))
        )})

analysis_list_factor_mean_cols_coded[1]
$`1`
# Transformed back into a mids
mids_coded <- datalist2mids(analysis_list_factor_mean_cols_coded)

Checking Assumptions on (Multivariate) Normality and Homoscedasticity

Before starting the factorial MANOVA, its underlying assumptions of normality and homoscedasticity are required to be checked on the basis of the prior encoded independent variables (Ståhle and Wold, 1990). The assumptions of independent objects, an invertible covariance matrix, and multicollinearity are given for both, MANOVA and post-hoc ANOVAs, and thus, are not further evaluated which stated in detail within the thesis (Ståhle and Wold, 1990; Kang and Jin, 2016; Brown, 2015).

The basis for the evaluation of multi- and univariate normality is laid by the null hypothesis of a normally distributed data sample (Shapiro and Wilk, 1965). Hence, the aim is to fail to reject the null hypothesis: H0: The dataset “is a sample from a normal distribution” (Shapiro and Wilk, 1965, p. 592).

As MANOVA as a multivariate approach is conducted first (Kang and Jin, 2016), the multivariate normality assumption is tested first, too. Therefore, the multivariate skewness and kurtosis test statistics procedure of Mardia (1970) is applied. Skewness and kurtosis provide information on the degree of deviation from multivariate normality (Kang and Jin, 2016). If both statistics result in p-values rejecting the null hypothesis, a multivariate non-normality is assumed (Zhou and Shao, 2014; Zhang, Zhou and Shao, 2025).

The Mardia test is conducted for the dependent variables within all of the 10 imputed datasets as a stacked dataset containing all 10 datasets in one would blurry results. As a consequence, 10 test statistic results are expected. The decision is made to not test multivariate normality per treatment group due to an increased complexity of interpreting 40 instead of 10 test statistics.

#mardia_test_treatment <- lapply(analysis_list_factor_mean_cols_coded, #function(df) {
#  df %>%
#  group_split(treatment) %>%
#    lapply(function(.group) 
#      mardia(.group[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")])$mv.test
#      )
#})

mardia_test <- lapply(analysis_list_factor_mean_cols_coded, function(df) {
      mardia(df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")])$mv.test
})

mardia_test
$`1`

$`2`

$`3`

$`4`

$`5`

$`6`

$`7`

$`8`

$`9`

$`10`
#mardia_test_treatment

Across all 10 test statistics multivariate non-normality is present as the third row’s (“MV Normality”) indicates within the fourth column (“Result”) with a “NO” value. This is because the tests for skewness and kurtosis reject the null hypothesis through p-values < 0.05. Except for the fifth test statistic of the fifth imputed dataset in which the test statistic of kurtosis ≈ 1.94, p-value ≈ 0.0524, result = YES. Although, the skewness leads to the overarching failure of accepting the null hypothesis for the fifth imputed dataset as the skewness statistic ≈ 82.93, p-value ≈ 0, result = NO and thus, rejects the null hypothesis. As all imputed datasets fail H0, we state that a non-normal multivariate distribution is prevalent for the at hand data sample consisting of 10 imputed datasets.

To further validate the normality assumption, the univariate normality of the dependent variables is evaluated using the Shapiro Wilk test (Shapiro and Wilk, 1965). W values close to 1 indicate the likelihood of normality and W values close to 0 the contrary (Shapiro and Wilk, 1965). The Shapiro Wilk test for normality is conducted for each imputed dataset as a stacked dataset containing all 10 datasets in one would blurry results. Moreover, univariate normality is tested per treatment group as ANOVA assumes normality for all dependent variables across all independent variables. In addition, the results for each dataset are calculated as mean for interpretation purposes.

shapiro_wilk_test_list <- lapply(analysis_list_factor_mean_cols_coded, function(df) {
  df %>%
    group_by(treatment) %>%
      shapiro_test(AC01_SCORE, DI01_SCORE, UI01_SCORE, EX01_SCORE)
})

shapiro_stacked <- bind_rows(shapiro_wilk_test_list)

shapiro_wilk_test_avg <- shapiro_stacked %>%
  group_by(treatment, variable) %>%
    summarise(
      mean_statistic = mean(statistic),
      mean_p = mean(p),
      .groups = "drop"
    )

shapiro_wilk_test_list
$`1`

$`2`

$`3`

$`4`

$`5`

$`6`

$`7`

$`8`

$`9`

$`10`
shapiro_wilk_test_avg

Despite predominantly close to 1 mean W-values, except for Vanilla - DI01_SCORE W ≈ 0.66, we must reject H0 for all dependent variables as the mean p-values are < 0.05. Only one treatment - variable combination fails to reject H0 (CoTxRAG - EX01_SCORE W ≈ 0.97) with a p-value ≈ 0.59. Examining the total list of results, it becomes apparent that CoTxRAG - EX01_SCORE W ≈ 0.97 consistently fails to reject H0 with a p-value < 0.05. Nevertheless, as the majority fails H0, we state that a non-normal univariate distribution is prevalent for the at hand data sample consisting of 10 imputed datasets.

Even though multi- and univariate non-normality is present, (M)ANOVA can be conducted due to their robustness to non-normality especially if the sample is large (Kang and Jin, 2016). As the dataset of the at hand thesis contains 131 samples with at least 20 participants per group which is in line with the rule of thumb of Bhattacherjee (2012), the sample is considered large and thus, robust against non-normality. Although, it has to be noted that the apparent non-normality might influence the power of the latter (M)ANOVA test statistics, e.g., Wilk’s lambda (Ståhle and Wold, 1990).

Another assumption relies within homoscedasticity/homogeneity of (co-)varianc ewhich is explained as a “constant error variance” (Von Eye and Wiedermann, 2023, p. 130). For MANOVA, the Box M test is suggested to validate the “multivariate homogeneity of variance-covariance matrix” (Kang and Jin, 2016, p. 4), i.e., that the variance-covariance matrix equals across treatments (Kang and Jin, 2016). Thus, the null hypothesis we aim to fail to reject is: H0: All the dependent variables have equal variance-covariance matrices.

The Box-M test is conducted for each imputed dataset:

box_m_test <- lapply(analysis_list_factor_mean_cols_coded, function(df) {
  result <- boxM(df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")], group = df$treatment)
})

box_m_test
$`1`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 60.102, df = 30, p-value = 0.0008949


$`2`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 66.014, df = 30, p-value = 0.0001624


$`3`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 61.992, df = 30, p-value = 0.0005249


$`4`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 68.128, df = 30, p-value = 8.607e-05


$`5`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 67.891, df = 30, p-value = 9.249e-05


$`6`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 61.081, df = 30, p-value = 0.0006799


$`7`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 70.395, df = 30, p-value = 4.297e-05


$`8`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 59.483, df = 30, p-value = 0.001063


$`9`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 62.02, df = 30, p-value = 0.0005206


$`10`

    Box's M-test for Homogeneity of Covariance Matrices

data:  df[, c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE")]
Chi-Sq (approx.) = 67.819, df = 30, p-value = 9.451e-05

The Box-M tests of all 10 imputed datasets report a chi-square statistic of closest to accepting for the eighth imputed dataset with a chi-square ≈ 59.483 on 30 df and a p-value ≈ 0.001063. Nevertheless, this p-value still leads to rejecting the H0. Although, if the significance level is set to 0.001, H0 would not be rejected for this dataset. However, as all the other test statistics display even more non-significant values, the at hand Box-M test indicates a heterogeneity of the variance-covariance matrixes and thus, a cautious interpretation of MANOVA test statistics is necessary (Denis, 2020).

As with the normality assumption evaluation, the univariate assumption of homogeneity of variances is evaluated in preparation for the post-hoc ANOVAs using Levene’s test. This test aims to validate the null hypothesis of: H0: All independent groups of an dependent variable have equal variances (Kaltenbach, 2021).

levene_test <- lapply(analysis_list_factor_mean_cols_coded, function(df){
  map_df(c("AC01_SCORE", "DI01_SCORE", "UI01_SCORE", "EX01_SCORE"), function(dep_var){
    result <- leveneTest(as.formula(paste(dep_var, "~ treatment")), data = df)
  })
})

levene_test
$`1`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.9427 0.4222
 ...2     127               
group...3   3  0.4851 0.6932
 ...4     127               
group...5   3  0.7175 0.5433
 ...6     127               
group...7   3  1.3204 0.2707
 ...8     127               

$`2`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.9137 0.4364
 ...2     127               
group...3   3  0.6282 0.5981
 ...4     127               
group...5   3  0.7480 0.5255
 ...6     127               
group...7   3  1.4164 0.2411
 ...8     127               

$`3`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.8321 0.4786
 ...2     127               
group...3   3  0.7686 0.5137
 ...4     127               
group...5   3  0.7959 0.4983
 ...6     127               
group...7   3  1.4712 0.2255
 ...8     127               

$`4`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.4342 0.7289
 ...2     127               
group...3   3  0.7801 0.5072
 ...4     127               
group...5   3  0.7480 0.5255
 ...6     127               
group...7   3  1.1196 0.3437
 ...8     127               

$`5`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.5641 0.6397
 ...2     127               
group...3   3  0.7266 0.5379
 ...4     127               
group...5   3  0.7175 0.5433
 ...6     127               
group...7   3  1.7547 0.1592
 ...8     127               

$`6`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.9065 0.4400
 ...2     127               
group...3   3  0.7269 0.5378
 ...4     127               
group...5   3  0.7148 0.5449
 ...6     127               
group...7   3  1.0677 0.3653
 ...8     127               

$`7`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  1.3386 0.2648
 ...2     127               
group...3   3  0.5955 0.6191
 ...4     127               
group...5   3  0.6230 0.6014
 ...6     127               
group...7   3  1.3892 0.2491
 ...8     127               

$`8`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.2252 0.8787
 ...2     127               
group...3   3  0.5202 0.6691
 ...4     127               
group...5   3  0.7735 0.5109
 ...6     127               
group...7   3  0.9684 0.4099
 ...8     127               

$`9`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.3785 0.7687
 ...2     127               
group...3   3  0.5424 0.6541
 ...4     127               
group...5   3  0.6970 0.5556
 ...6     127               
group...7   3  1.2322 0.3008
 ...8     127               

$`10`
Levene's Test for Homogeneity of Variance (center = median)
           Df F value Pr(>F)
group...1   3  0.7733 0.5110
 ...2     127               
group...3   3  0.5928 0.6208
 ...4     127               
group...5   3  0.7480 0.5255
 ...6     127               
group...7   3  1.8371 0.1437
 ...8     127               

In contrast to the multivariate test statistics, the univariate H0 is likely to be accepted. As even the test statistic result whose p-value is closest to 0, points on accepting H0. This test statistic for the tenth imputed dataset’s group 7 which is the group CoTxRAG with 3 df (as all other test statistics) and an F-value ≈ 1.8371 followed by a p-value ≈ 0.1437. Hence, the conclusion is made that H0 is likely to be accepted that all variances are homogeneous for a significance value of 0.05. This is further reinforced by the prior descriptive statistics which already indicated only a minor difference in variance among the independent groups.

Two-way MANOVA

The applied sequence of work aligns to the proposal of Kang and Jin (2016) on how to proceed with factorial MANOVA. This proposal and the at hand findings led to the following sequence:
  1. Factorial MANOVA,
  2. Factorial ANOVA,
  3. Post-hoc factorial ANOVA main effect analysis (Kang and Jin, 2016).
manova_fit <- with(mids_coded, manova(cbind(AC01_SCORE, DI01_SCORE, UI01_SCORE, EX01_SCORE) ~ CoT * RAG))

manova_model <- summary(manova_fit, test = c("Pillai"))
manova_model

For interpretation purposes, the F-statistic (column: “statistic”) is pooled as a mipo object for all factor levels, i.e., CoT, RAG, and the interaction CoT:RAG and combined as an mira object in line with Van Buuren and Groothuis-Oudshoorn (2011):

# Extract all F-statistics for each level and combination, i.e., 10 F-statistic values for each treatment
manova_stats_CoT <- map_dbl(manova_fit$analyses, ~{tidy(.x)$statistic[1]})
manova_stats_RAG <- map_dbl(manova_fit$analyses, ~{tidy(.x)$statistic[2]})
manova_stats_CoTxRAG <- map_dbl(manova_fit$analyses, ~{tidy(.x)$statistic[3]})

# Pool the F-statistic based on Rubin's rules
pooled_F_stats_CoT <- micombine.F(manova_stats_CoT, df = 10)
Combination of Chi Square Statistics for Multiply Imputed Data
Using 10 Imputed Data Sets
F(10, 678.41)=1.856     p=0.04833 
pooled_F_stats_RAG <- micombine.F(manova_stats_RAG, df = 10)
Combination of Chi Square Statistics for Multiply Imputed Data
Using 10 Imputed Data Sets
F(10, 9.65)=23.61     p=2e-05 
pooled_F_stats_CoTxRAG <- micombine.F(manova_stats_CoTxRAG, df = 10)
Combination of Chi Square Statistics for Multiply Imputed Data
Using 10 Imputed Data Sets
F(10, 113.54)=0.434     p=0.92734 

For visualization and interpretation purposes, the values are depicted within a MANOVA-like table as follows:

# Combine pooled results within a table
pooled_manova_CoT <- data.frame(term = c("CoT"))
pooled_manova_RAG <- data.frame(term = c("RAG"))
pooled_manova_CoTxRAG <- data.frame(term = c("CoT:RAG"))

# Transpone pooled stats
pooled_F_stats_CoT_df <- t(as.data.frame(pooled_F_stats_CoT))
pooled_F_stats_RAG_df <- t(as.data.frame(pooled_F_stats_RAG))
pooled_F_stats_CoTxRAG_df <- t(as.data.frame(pooled_F_stats_CoTxRAG))

# Combine transponed, pooled stats with preprint
pooled_manova <- bind_rows(bind_cols(pooled_manova_CoT, pooled_F_stats_CoT_df), bind_cols(pooled_manova_RAG, pooled_F_stats_RAG_df), bind_cols(pooled_manova_CoTxRAG, pooled_F_stats_CoTxRAG_df))

pooled_manova <- pooled_manova %>%
  rename(
    statistic = D
  )

pooled_manova

The pooled MANOVA results indicate soley significant main effects and no significant interaction effect according to a significance level alpha = 0.05. For CoT, a pooled F(10, 678) ≈ 1.8558, p ≈ 0.0483 indicates a significant main effect rejecting the H01b leading to the assumption that the CoT treatment has a multivariate effect on the dimensions of transparency. For RAG, a pooled F(10, 10) ≈ 23.6102, p < 0.0001 indicates a significant main effect rejecting the H01a leading to the assumption that the RAG treatment has an even stronger multivariate effect on the dimensions of transparency. As the interaction CoT:RAG with F(10, 114) ≈ 0.4336, p ≈ 0.9273 indicates no significant interaction effect, the test fails to reject H02. This indicates that it is likely that the CoT enhanced by RAG leads no synergy effects in improving transparency.

The latter observation leads to a factorial ANOVA for each dependent variable, i.e., transparency dimension, in line with the workflow of Kang and Jin (2016).

Factorial ANOVA

The factorial ANOVAs are applied to all imputed data as with factorial MANOVA (Rubin, 1987; Van Buuren and Groothuis-Oudshoorn, 2011). Contrary to MANOVA, not only the F-statistics are pooled, but whole ANOVA’s are pooled using a built-capability of the miceadds package in R (Robitzsch, Grund and Henke, 2025). This allows to use the type II sum of squares method for the pooled ANOVA calculation (Robitzsch, Grund and Henke, 2025). The pooling also delivers the effect size measures (partial) eta squared based on the variance explained (r squared) (Robitzsch, Grund and Henke, 2025). Although, solely the partial eta squared metric is examined (Kaltenbach, 2021).

# Listed ANOVAS across all imputed datasets
anova_fit_list_ac <- with(mids_coded, anova(lm(AC01_SCORE ~ CoT * RAG)))
anova_fit_list_di <- with(mids_coded, anova(lm(DI01_SCORE ~ CoT * RAG)))
anova_fit_list_ui <- with(mids_coded, anova(lm(UI01_SCORE ~ CoT * RAG)))
anova_fit_list_ex <- with(mids_coded, anova(lm(EX01_SCORE ~ CoT * RAG)))

summary(anova_fit_list_ac)
summary(anova_fit_list_di)
summary(anova_fit_list_ui)
summary(anova_fit_list_ex)

# Pooled ANOVAS
pooled_anova_fit_ac <- mi.anova(mi.res = mids_coded, formula = "AC01_SCORE ~ CoT * RAG", type = 2)
Univariate ANOVA for Multiply Imputed Data (Type 2)  

lm Formula:  AC01_SCORE ~ CoT * RAG
R^2=0.0478 
..........................................................................
ANOVA Table 
pooled_anova_fit_di <- mi.anova(mi.res = mids_coded, formula = "DI01_SCORE ~ CoT * RAG", type = 2)
Univariate ANOVA for Multiply Imputed Data (Type 2)  

lm Formula:  DI01_SCORE ~ CoT * RAG
R^2=0.6797 
..........................................................................
ANOVA Table 
pooled_anova_fit_ui <- mi.anova(mi.res = mids_coded, formula = "UI01_SCORE ~ CoT * RAG", type = 2)
Univariate ANOVA for Multiply Imputed Data (Type 2)  

lm Formula:  UI01_SCORE ~ CoT * RAG
R^2=0.0096 
..........................................................................
ANOVA Table 
pooled_anova_fit_ex <- mi.anova(mi.res = mids_coded, formula = "EX01_SCORE ~ CoT * RAG", type = 2)
Univariate ANOVA for Multiply Imputed Data (Type 2)  

lm Formula:  EX01_SCORE ~ CoT * RAG
R^2=0.1078 
..........................................................................
ANOVA Table 
# R-squared values for each pooled ANOVA table
print(pooled_anova_fit_ac$r.squared)
[1] 0.0478133
print(pooled_anova_fit_di$r.squared)
[1] 0.6796933
print(pooled_anova_fit_ui$r.squared)
[1] 0.00963634
print(pooled_anova_fit_ex$r.squared)
[1] 0.1077718

The factorial ANOVAs’ results are stored within the following tables which serve as a foundation for the interpretation, respectively.

# Summary tables
anova_ac <- data_frame(
  AC01 = c("CoT", "RAG", "CoT:RAG", "Residual")
)
anova_ac <- bind_cols(anova_ac, pooled_anova_fit_ac)
anova_ac <- anova_ac[, c(1, 3, 4, 5, 6, 7, 2, 8, 9, 10)]

anova_di <- data_frame(
  DI01 = c("CoT", "RAG", "CoT:RAG", "Residual")
)
anova_di <- bind_cols(anova_di, pooled_anova_fit_di)
anova_di <- anova_di[, c(1, 3, 4, 5, 6, 7, 2, 8, 9, 10)]

anova_ui <- data_frame(
  UI01 = c("CoT", "RAG", "CoT:RAG", "Residual")
)
anova_ui <- bind_cols(anova_ui, pooled_anova_fit_ui)
anova_ui <- anova_ui[, c(1, 3, 4, 5, 6, 7, 2, 8, 9, 10)]

anova_ex <- data_frame(
  EX01 = c("CoT", "RAG", "CoT:RAG", "Residual")
)
anova_ex <- bind_cols(anova_ex, pooled_anova_fit_ex)
anova_ex <- anova_ex[, c(1, 3, 4, 5, 6, 7, 2, 8, 9, 10)]

anova_ac
anova_di
anova_ui
anova_ex

For the dependent variable of accountability (AC01_SCORE), only the main effect of CoT is likely to be significant with F(1, 10375) ≈ 4.7799, p ≈ 0.0288, partial.eta2 ≈ 0.03768. This indicates that the CoT treatment is likely to influence the accountability dimension of transparency with a different mean compared to the other groups. Although, the low partial.eta2 value of ≈ 3.8 % points to a low impact of the treatment’s characteristics on the overall variation of the dimension. The high sum of squared errors for the residual indicates only slight differences among treatment groups.

For the dependent variable of disclosure (DI01_SCORE), only the main effect of RAG is likely to be significant with F(1, 59) ≈ 164.7453, p < 0.0001, partial.eta2 ≈ 0.679621. These metrics indicate that the mean value of RAG varies significantly compared to the other treatments. Moreover, the RAG treatment can be expected to influence the dimension of disclosure heavily which is underpinned by relatively high partial.eta2 value that indicates that in ≈ 68.0 % the overall variation of the dimension is impacted by RAG.

For the dependent variable of usefulness of information (UI01_SCORE) no significant effect is detected. However, as the residual sum of squarred errors is higher than for each effect the variation of this dimension remains unexplained and for this dimension there are no differences that can be appointed towards any treatment group (Kaltenbach, 2021).

For the dependent variable of explainability (EX01_SCORE), RAG reveals likely to be the only significant main effect again with F(1, 32255) ≈ 13.6770, p ≈ 0.0002, partial.eta2 ≈ 0.0989. This indicates a different mean for RAG and an impact of ≈ 9.9 % according to partial.eta2 on this dimension’s variation. The high sum of squared errors for the residual indicates only slight differences among treatment groups.

As the main effects repeatedly proved likely to be responsible for the differences in variations of each dependent variable except for usefulness of information (UI01_SCORE), a post-hoc analysis of main effect contrasts is conducted.

Post-Hoc Main Effect Contrasts

To verify the prior results, a post-hoc main effect contrast analysis is conducted. In contrast to the beforehand analysis, the linear contrasts analysis provides a detailed view on how the main effects differ. The foundation for contrast analysis is set through the calculation of estimated marginal means. (Kaltenbach, 2021)

In line with Kaltenbach (2021) the full model for each dimension: “AC01_SCORE | DI01_SCORE | UI01_SCORE | EX01_SCORE ~ CoT + RAG + CoT * RAG” is used to calculate respective estimated marginal means. Moreover, the prior set coding is reused again for the the calculations. Due to the unbalanced setting, Kang and Jin (2016) suggest to use the method by Sidak to adjust respective confidence intervals.

model_ac <- with(mids_coded, lm(AC01_SCORE ~ CoT + RAG + CoT * RAG))
model_di <- with(mids_coded, lm(DI01_SCORE ~ CoT + RAG + CoT * RAG))
model_ui <- with(mids_coded, lm(UI01_SCORE ~ CoT + RAG + CoT * RAG))
model_ex <- with(mids_coded, lm(EX01_SCORE ~ CoT + RAG + CoT * RAG))

# Lay the foundation for estimated marginal means calculation - check it once
reference <- ref_grid(model_ac)
reference
'emmGrid' object with variables:
    CoT = 0, 1
    RAG = 0, 1
# Calculate estimated marginal means on the basis of the reference
estimated_marginal_means_ac <- emmeans(model_ac, ~ CoT + RAG + CoT * RAG, adjust = "sidak")
estimated_marginal_means_di <- emmeans(model_di, ~ CoT + RAG + CoT * RAG, adjust = "sidak")
estimated_marginal_means_ui <- emmeans(model_ui, ~ CoT + RAG + CoT * RAG, adjust = "sidak")
estimated_marginal_means_ex <- emmeans(model_ex, ~ CoT + RAG + CoT * RAG, adjust = "sidak")

# Output
estimated_marginal_means_ac
 CoT RAG emmean    SE  df lower.CL upper.CL
 0   0     4.11 0.121 118     3.81     4.42
 1   0     3.94 0.116 120     3.65     4.24
 0   1     4.18 0.135 117     3.84     4.52
 1   1     3.75 0.147  90     3.38     4.13

Confidence level used: 0.95 
Conf-level adjustment: sidak method for 4 estimates 
estimated_marginal_means_di
 CoT RAG emmean    SE    df lower.CL upper.CL
 0   0     1.59 0.151  97.2     1.21     1.97
 1   0     1.71 0.139 120.8     1.35     2.06
 0   1     4.09 0.159 124.6     3.68     4.49
 1   1     4.18 0.167 119.5     3.75     4.60

Confidence level used: 0.95 
Conf-level adjustment: sidak method for 4 estimates 
estimated_marginal_means_ui
 CoT RAG emmean     SE  df lower.CL upper.CL
 0   0     4.44 0.1000 125     4.19     4.70
 1   0     4.46 0.0965 125     4.22     4.71
 0   1     4.32 0.1130 123     4.03     4.60
 1   1     4.36 0.1180 120     4.07     4.66

Confidence level used: 0.95 
Conf-level adjustment: sidak method for 4 estimates 
estimated_marginal_means_ex
 CoT RAG emmean    SE  df lower.CL upper.CL
 0   0     2.01 0.167 122     1.58     2.43
 1   0     1.97 0.159 125     1.57     2.37
 0   1     2.48 0.188 118     2.00     2.95
 1   1     2.81 0.195 117     2.31     3.30

Confidence level used: 0.95 
Conf-level adjustment: sidak method for 4 estimates 

As the means have already been interpreted within the descriptive analysis, these observations solely serve as a foundation for the contrast analysis that follows. For each contrast a two-sided t-test combined with a resulting p-value is calculated. The overarching goal of the main effect contrast analysis is to verify prior F-test results of (M)ANOVA and to show the degree of difference of respective main effects to other treatment groups. Thus, the aim is to reject the null hypothesis: H0: All contrasts = 0. For adjusting the p-values to the characteristics of the sample and to post-hoc testing, the Scheffe correction is used. (Kaltenbach, 2021)

Only the already after the prior analysis likely effects are examined. Except for the case that a new effect reveals to be significant.

contrasts_examined <- list(
  "Vanilla vs. CoT" = c(1, -1, 0, 0),
  "Vanilla vs. RAG" = c(1, 0, -1, 0),
  "CoT (Inference) vs. RAG (Post-Training)" = c(0, 1, -1, 0)
)

# Calculate main effect contrasts
main_effect_contrasts_ac <- contrast(estimated_marginal_means_ac, method = contrasts_examined, adjust = "scheffe")
main_effect_contrasts_di <- contrast(estimated_marginal_means_di, method = contrasts_examined, adjust = "scheffe")
main_effect_contrasts_ui <- contrast(estimated_marginal_means_ui, method = contrasts_examined, adjust = "scheffe")
main_effect_contrasts_ex <- contrast(estimated_marginal_means_ex, method = contrasts_examined, adjust = "scheffe")

# Add t-tests, p-values, confidence intervals
main_effect_contrasts_ac_res <- summary(
  main_effect_contrasts_ac,
  infer = c(TRUE, TRUE)
  )
main_effect_contrasts_di_res <- summary(
  main_effect_contrasts_di, 
  infer = c(TRUE, TRUE)
  )
main_effect_contrasts_ui_res <- summary(
  main_effect_contrasts_ui, 
  infer = c(TRUE, TRUE)
  )
main_effect_contrasts_ex_res <- summary(
  main_effect_contrasts_ex, 
  infer = c(TRUE, TRUE)
  )

# Display contrasts
main_effect_contrasts_ac_res
 contrast                                estimate    SE  df lower.CL upper.CL
 Vanilla vs. CoT                           0.1680 0.168 118   -0.248    0.585
 Vanilla vs. RAG                          -0.0694 0.182 117   -0.520    0.381
 CoT (Inference) vs. RAG (Post-Training)  -0.2374 0.177 120   -0.677    0.202
 t.ratio p.value
   1.000  0.6077
  -0.382  0.9297
  -1.338  0.4112

Confidence level used: 0.95 
Conf-level adjustment: scheffe method with rank 2 
P value adjustment: scheffe method with rank 2 
main_effect_contrasts_di_res
 contrast                                estimate    SE  df lower.CL upper.CL
 Vanilla vs. CoT                           -0.116 0.205 111   -0.624    0.391
 Vanilla vs. RAG                           -2.498 0.220 112   -3.045   -1.951
 CoT (Inference) vs. RAG (Post-Training)   -2.382 0.212 122   -2.907   -1.857
 t.ratio p.value
  -0.568  0.8512
 -11.331  <.0001
 -11.244  <.0001

Confidence level used: 0.95 
Conf-level adjustment: scheffe method with rank 2 
P value adjustment: scheffe method with rank 2 
main_effect_contrasts_ui_res
 contrast                                estimate    SE  df lower.CL upper.CL
 Vanilla vs. CoT                          -0.0171 0.139 125   -0.362    0.328
 Vanilla vs. RAG                           0.1255 0.151 124   -0.248    0.499
 CoT (Inference) vs. RAG (Post-Training)   0.1426 0.148 124   -0.225    0.510
 t.ratio p.value
  -0.123  0.9925
   0.831  0.7084
   0.961  0.6311

Confidence level used: 0.95 
Conf-level adjustment: scheffe method with rank 2 
P value adjustment: scheffe method with rank 2 
main_effect_contrasts_ex_res
 contrast                                estimate    SE  df lower.CL upper.CL
 Vanilla vs. CoT                           0.0321 0.231 123   -0.539    0.604
 Vanilla vs. RAG                          -0.4740 0.249 123   -1.091    0.143
 CoT (Inference) vs. RAG (Post-Training)  -0.5061 0.246 121   -1.116    0.104
 t.ratio p.value
   0.139  0.9903
  -1.905  0.1673
  -2.056  0.1251

Confidence level used: 0.95 
Conf-level adjustment: scheffe method with rank 2 
P value adjustment: scheffe method with rank 2 

For the accountability dimension (AC01_SCORE), the main effect of CoT is examined. The post-hoc analysis for accountability reveals no significant differences between Vanilla and CoT, p ≈ 0.6077 (mean_diff ≈ 0.1680, 95%-CI[-0.248, 0.585]) and between CoT and RAG, p ≈ 0.4112 (mean_diff ≈ -0.2374, 95%-CI[-0.677, 0.202]). Consequently, the assumption of likely significant CoT main effect for accountability is withdrawn due to a likely non-significance revealed through contrast analysis despite a likely rejection of the null hypothesis.

However, the main effect of RAG for the dimension of disclosure (DI01_SCORE) is likely to be verified by contrast analysis. This is due to a significant difference between Vanilla and RAG, p < 0.0001 (mean_diff ≈ -2.498, 95%-CI[-3.045, -1.951]) and between CoT and RAG, p < 0.0001 (mean_diff ≈ -2.382, 95%-CI[-2.907, -1.857]). Those values indicate that the estimated mean differs ≈ 2 ratings between RAG and the other two treatment groups within the upper CI even around 3 points. It has to be noted that the higher SEs of disclosure compared to the SEs of accountability and usefulness of information lead to increased CIs. Nevertheless, and underpinned by the prior descriptive analysis, the main effect of RAG is verified to be likely significant. Consequently, the null hypothesis is rejected.

For usefulness of information (UI01_SCORE), the non-significance of all treatment groups is likely to be assumed. An example for this is the non-significant difference between Vanilla and CoT, p ≈ 0.9925 (mean_diff ≈ -0.0171, 95%-CI[-0.362, 0.328]). Nevertheless, the null hypothesis is rejected.

For the explainability dimension (EX01_SCORE), the significance assumption of RAG is likely to be declined on the basis of the contrast analysis’ results. The post-hoc analysis for explainability shows no significant differences between Vanilla and RAG, p ≈ 0.1673 (mean_diff ≈ -0.4740, 95%-CI[-1.091, 0.143]) and between CoT and RAG, p ≈ 0.1251 (mean_diff ≈ -0.5061, 95%-CI[-1.116, 0.104]). The highest SEs compared to the other dependent variables’ SEs lead to broad CIs that might indicate potential significant differences, e.g., differences of 1 rating point for RAG compared to other treatment groups. Due to the high SEs these CI values can be neglected. The previously as likely recognized significant effect of RAG on the dimension of explainability is likely to be non-significant. The null hypothesis is rejected.

To conclude after all observations, only the main effect of RAG for the dependent variable of disclosure (DI01_SCORE) showed a moderate likelihood of significance. Whereas main effects that were perceived likely significant after factorial ANOVA are more likely to be non-significant, i.e., main effect of CoT on accountability and main effect of RAG on explainability. For the dependent variable of usefulness of information no significant effects seemed to be prevalent which refers to negligible differences between each treatments’ effects.

The at hand results lays the foundation for the discussion within the thesis.

Save Results

sum_of_all_save <- save(sum_of_all, file = "MANOVA_storage/sum_of_all.RData")
descriptive_stats_save <- save(descriptive_stats, file = "MANOVA_storage/descriptive_stats.RData")
analysis_list_factor_mean_cols_coded_save <- save(analysis_list_factor_mean_cols_coded, file = "MANOVA_storage/analysis_list_factor_mean_cols_coded.RData")
manova_model_save <- save(manova_model, file = "MANOVA_storage/manova_model.RData")
pooled_manova_save <- save(pooled_manova, file = "MANOVA_storage/pooled_manova.RData")
anova_fit_list_ac_save <- save(anova_fit_list_ac, file = "MANOVA_storage/anova_fit_list_ac.RData")
anova_fit_list_di_save <- save(anova_fit_list_di, file = "MANOVA_storage/anova_fit_list_di.RData")
anova_fit_list_ui_save <- save(anova_fit_list_ui, file = "MANOVA_storage/anova_fit_list_ui.RData")
anova_fit_list_ex_save <- save(anova_fit_list_ex, file = "MANOVA_storage/anova_fit_list_ex.RData")
pooled_anova_fit_ac_save <- save(pooled_anova_fit_ac, file = "MANOVA_storage/pooled_anova_fit_ac.RData")
pooled_anova_fit_di_save <- save(pooled_anova_fit_di, file = "MANOVA_storage/pooled_anova_fit_di.RData")
pooled_anova_fit_ui_save <- save(pooled_anova_fit_ui, file = "MANOVA_storage/pooled_anova_fit_ui.RData")
pooled_anova_fit_ex_save <- save(pooled_anova_fit_ex, file = "MANOVA_storage/pooled_anova_fit_ex.RData")
estimated_marginal_means_ac_save <- save(estimated_marginal_means_ac, file = "MANOVA_storage/estimated_marginal_means_ac.RData")
estimated_marginal_means_di_save <- save(estimated_marginal_means_di, file = "MANOVA_storage/estimated_marginal_means_di.RData")
estimated_marginal_means_ui_save <- save(estimated_marginal_means_ui, file = "MANOVA_storage/estimated_marginal_means_ui.RData")
estimated_marginal_means_ex_save <- save(estimated_marginal_means_ex, file = "MANOVA_storage/estimated_marginal_means_ex.RData")
main_effect_contrasts_ac_res_save <- save(main_effect_contrasts_ac_res, file = "MANOVA_storage/main_effect_contrasts_ac_res.RData")
main_effect_contrasts_di_res_save <- save(main_effect_contrasts_di_res, file = "MANOVA_storage/main_effect_contrasts_di_res.RData")
main_effect_contrasts_ui_res_save <- save(main_effect_contrasts_ui_res, file = "MANOVA_storage/main_effect_contrasts_ui_res.RData")
main_effect_contrasts_ex_res_save <- save(main_effect_contrasts_ex_res, file = "MANOVA_storage/main_effect_contrasts_ex_res.RData")

Latex Exports

LS0tCnRpdGxlOiAiTUFOT1ZBIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGlzIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBleHBlcmltZW50J3MgcmVzdWx0cy4gVGhlIGZvY3VzIG9mIHRoaXMgbm90ZWJvb2sgaXMgb24gYW5zd2VyaW5nIHRoZSByZXNlYXJjaCBxdWVzdGlvbiBieSBjb25kdWN0aW5nIGEgZmFjdG9yaWFsIG11bHRpdmFyaWF0ZSBhbmFseXNpcyBvZiB2YXJpYW5jZSAoTUFOT1ZBKSBvbiB0aGUgZm91bmRhdGlvbiBvZiB0aGUgbWVhc3VyZW1lbnQgbW9kZWwgd2hpY2ggaGFzIGJlZW4gdmFsaWRhdGVkIHByZXZpb3VzbHkgdXNpbmcgYW4gb3JkaW5hbCBjb25maXJtYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChDRkEpLgoKVGhpcyBub3RlYm9vayBleHBhbmRzIHRoZSBtYXN0ZXIgdGhlc2lzIGJ5IGRhdGEgYW5hbHlzaXMgYW5kIHJlc3BlY3RpdmUgY29kZSBhcyB3ZWxsIGFzIHNob3J0IGV4cGxhbmF0aW9ucy4gVGhpcyBtYXJrZG93biBkb2VzIG5vdCByZXBsYWNlIHRoZSB0aGVzaXMsIGl0IHNlcnZlcyBzb2xlbHkgYXMgYW4gYXBwZW5kaXguCgo8aDE+TGlicmFyeSBEb3dubG9hZHM8L2gxPgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShmaW5hbGZpdCkKbGlicmFyeShtaWNlKQpsaWJyYXJ5KG1pY2VhZGRzKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkobGF2YWFuKQpsaWJyYXJ5KGxhdmFhbi5taSkKbGlicmFyeShzZW1wdG9vbHMpCmxpYnJhcnkoc2VtVG9vbHMpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkoVEFNKQpsaWJyYXJ5KERlc2NUb29scykKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkocnN0YXRpeCkKbGlicmFyeShtdm5vcm1hbFRlc3QpCmxpYnJhcnkoYmlvdG9vbHMpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGVmZmVjdHNpemUpCmxpYnJhcnkoZW1tZWFucykKYGBgCgo8aDE+U2FtcGxlIExvYWQgYW5kIERhdGEgUHJlcGFyYXRpb248L2gxPgpGaXJzdCwgdGhlIHByZXZpb3VzbHkgaW1wdXRlZCBkYXRhIGlzIGxvYWRlZCBhcyBhIG1pZHMgb2JqZWN0OgoKYGBge3J9CmdldHdkKCkKZmluYWxfaW1wdXRlZF9kYXRhIDwtIHJlYWRfcmRzKCJkYXRhL21pX21pZHNfb2JqZWN0LnJkcyIpCmdsaW1wc2UoZmluYWxfaW1wdXRlZF9kYXRhWzFdKQpgYGAKCkFzIE1BTk9WQSBpcyBhIHBhcmFtZXRyaWMgbWV0aG9kIHRoYXQgaXMgYXBwbGllZCB0byBhbmFseXplIGRpZmZlcmVuY2VzIGJldHdlZW4gbXVsdGlwbGUsIGNvbnRpbnVvdXMgZGVwZW5kZW50IHZhcmlhYmxlcywgdGhlIG1lYW5zIGZvciBlYWNoIGZhY3RvciBvZiB0aGUgZm91ciBmYWN0b3JzIGFyZSBjYWxjdWxhdGVkIGZpcnN0IChLYW5nIGFuZCBKaW4sIDIwMTYpLiBBbHRob3VnaCwgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBtZWFuIG9uIHRoZSBiYXNpcyBvZiBhbiBvcmRpbmFsIHNjYWxlIG5lY2Vzc2l0YXRlcyAiYSBjb2xsZWN0aW9uIG9mIHB1cnBvc2VmdWxseSBjb25zdHJ1Y3RlZCBpdGVtcyIgW3AuIDEwOV0gb24gdGhlIG1hY3JvIHNjYWxlIChDYXJpZmlvIGFuZCBQZXJsYSwgMjAwNykuIE9uIHRoZSBiYXNpcyBvZiB0aGlzIG1lYXN1cmVtZW50IHNjYWxlIHBlcnNwZWN0aXZlLCBtZWFucyBhcyBwYXJhbWV0cmljIHN0YXRpc3RpY2FsIHN0cnVjdHVyZXMgY2FuIGJlIGNvbnN0cnVjdGVkIG9uIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBpdGVtcyBhc3NpZ25lZCB0byB0aGUgcHVycG9zZWZ1bCBmYWN0b3JzIChDYXJpZmlvIGFuZCBQZXJsYSwgMjAwNykuIFRoZXNlIGZhY3RvcnMgYXJlIHZlcmlmaWVkIGluIHRoZWlyIHB1cnBvc2UgdGhyb3VnaCB0aGUgcHJldmlvdXNseSBjb25kdWN0ZWQgb3JkaW5hbCBDRkEuIENvbnNlcXVlbnRseSwgdGhlIGZvbGxvd2luZyBtZWFzdXJlbWVudCBtb2RlbCBzZXJ2ZXMgYXMgYSBiYXNpcyBmb3IgdGhlIGZvbGxvd2luZyBtZWFuIGNhbGN1bGF0aW9uIHBlciBmYWN0b3I6Cgo8dWw+CjxsaT5BY2NvdW50YWJpbGl0eTogQUMwMV8wMSwgQUMwMV8wMiwgQUMwMV8wMzwvbGk+CjxsaT5EaXNjbG9zdXJlOiBESTAxXzAyICsgREkwMV8wMyArIERJMDFfMDQgKyBFWDAxXzA0PC9saT4KPGxpPlVzZWZ1bG5lc3M6IFVJMDFfMDEsIFVJMDFfMDIgPC9saT4KPGxpPkV4cGxhaW5hYmlsaXR5OiBFWDAxXzAyICsgRVgwMV8wMyArIFVJMDFfMDQuPC9saT4KPC91bD4KCkZpcnN0LCB0aGUgaXRlbXMgb2YgdGhlIG1lYXN1cmVtZW50IG1vZGVsIGFuZCB0aGUgdHJlYXRtZW50IHZhcmlhYmxlIFRSMDEsIHdoaWNoIGRlcGljdHMgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlIChLYWx0ZW5iYWNoLCAyMDIxKSwgbXVzdCBiZSBleHRyYWN0ZWQgb2YgdGhlIGltcHV0ZWQgZGF0YToKCmBgYHtyfQpmYWN0b3JfcmVsZXZhbnRfY29scyA8LSBjKCJBQzAxXzAxIiwgIkFDMDFfMDIiLCAiQUMwMV8wMyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJESTAxXzAyIiwgIkRJMDFfMDMiLCAiREkwMV8wNCIsICJFWDAxXzA0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVUkwMV8wMSIsICJVSTAxXzAyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYMDFfMDIiLCAiRVgwMV8wMyIsICJVSTAxXzA0IikKdHJlYXRtZW50X2NvbCA8LSBjKCJUUjAxIikKdG90YWxfY29scyA8LSBjKGZhY3Rvcl9yZWxldmFudF9jb2xzLCB0cmVhdG1lbnRfY29sKQoKbGlzdF9vZl9mYWNfcmVsX2NvbHMgPC0gbGFwcGx5KGNvbXBsZXRlKGZpbmFsX2ltcHV0ZWRfZGF0YSwgImFsbCIpLCBmdW5jdGlvbihkZikgZGZbLCB0b3RhbF9jb2xzXSkKCmdsaW1wc2UobGlzdF9vZl9mYWNfcmVsX2NvbHNbMV0pCmBgYAoKSW4gYWRkaXRpb24sIGZvdXIgbmV3IGNvbHVtbnMgYXJlIGludHJvZHVjZWQgZm9yIGVhY2ggZmFjdG9yIGluIHdoaWNoIHRoZSBjYWxjdWxhdGVkIG1lYW4gaXMgc3RvcmVkIGZvciBlYWNoIGltcHV0ZWQgZGF0YXNldC4gVGhlc2UgZm91ciByZXN1bHRpbmcgYWRkaXRpb25hbCB2YXJpYWJsZXMgZGVwaWN0ZWQgYXMgdmFsdWUgY29sdW1ucyBhcmUgdGhlIGRlcGVuZGVudCB2YXJpYWJsZXMgdG8gYmUgY29uZHVjdGVkIChLYW5nIGFuZCBKaW4sIDIwMTY7IEthbHRlbmJhY2gsIDIwMjEpOgoKYGBge3J9Cmxpc3RfZmFjdG9yX21lYW5fY29scyA8LSBsYXBwbHkobGlzdF9vZl9mYWNfcmVsX2NvbHMsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiAlPiUKICAgICAgbXV0YXRlKAogICAgICAgIGFjcm9zcyhhbGxfb2YoZmFjdG9yX3JlbGV2YW50X2NvbHMpLCB+YXMuaW50ZWdlcigueCkpLAogICAgICAgIEFDMDFfU0NPUkUgPSByb3VuZChyb3dNZWFucyhhY3Jvc3MoYygiQUMwMV8wMSIsICJBQzAxXzAyIiwgIkFDMDFfMDMiKSksIG5hLnJtID0gVFJVRSksIDIpLAogICAgICAgIERJMDFfU0NPUkUgPSByb3VuZChyb3dNZWFucyhhY3Jvc3MoYygiREkwMV8wMiIsICJESTAxXzAzIiwgIkRJMDFfMDQiLCAiRVgwMV8wNCIpKSwgbmEucm0gPSBUUlVFKSwgMiksCiAgICAgICAgVUkwMV9TQ09SRSA9IHJvdW5kKHJvd01lYW5zKGFjcm9zcyhjKCJVSTAxXzAxIiwgIlVJMDFfMDIiKSksIG5hLnJtID0gVFJVRSksIDIpLAogICAgICAgIEVYMDFfU0NPUkUgPSByb3VuZChyb3dNZWFucyhhY3Jvc3MoYygiRVgwMV8wMiIsICJFWDAxXzAzIiwgIlVJMDFfMDQiKSksIG5hLnJtID0gVFJVRSksIDIpLAogICAgICAgIGFjcm9zcyhhbGxfb2YoZmFjdG9yX3JlbGV2YW50X2NvbHMpLCB+YXMub3JkZXJlZCgueCkpLAogICAgICAgIGFjcm9zcyhhbGxfb2YodHJlYXRtZW50X2NvbCksIH5hcy5mYWN0b3IoLngpKQogICAgICApICU+JQogICAgICAgIHJlbmFtZSh0cmVhdG1lbnQgPSBUUjAxKQp9KQoKbGlzdF9mYWN0b3JfbWVhbl9jb2xzWzFdCmBgYAoKRm9yIGFuIGltcHJvdmVkIGNsYXJpdHkgb2YgdGhlIGxhdHRlciB2aXN1YWwgYW5hbHlzaXMgb2YgdGhlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgKGJveHBsb3RzKSBhcyB3ZWxsIGFzIHRoZSAoTSlBTk9WQSBpbnZlc3RpZ2F0aW9ucywgdGhlIHRyZWF0bWVudCBjb2x1bW4gaXMgcmVjb2RlZCAoMSA9IFZhbmlsbGEsIDIgPSBDb1QsIDMgPSBSQUcsIDQgPSBDb1R4UkFHKS4gVGhlcmVmb3JlLCBhbm90aGVyIGxpc3QgImFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29scyIgaXMgY3JlYXRlZCB1cG9uIHRoZSBieSBtZWFucyBleHBhbmRlZCBvcmlnaW5hbCBsaXN0IG9mIGltcHV0ZWQgZGF0YXNldHMgImxpc3RfZmFjdG9yX21lYW5fY29scyIuCgpgYGB7cn0KYW5hbHlzaXNfbGlzdF9mYWN0b3JfbWVhbl9jb2xzIDwtIGxhcHBseShsaXN0X2ZhY3Rvcl9tZWFuX2NvbHMsIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiAlPiUKICAgICAgICBtdXRhdGUoCiAgICAgICAgdHJlYXRtZW50ID0gY2FzZV9tYXRjaCgKICAgICAgICAgIHRyZWF0bWVudCwgCiAgICAgICAgICAiMSIgfiAiVmFuaWxsYSIsCiAgICAgICAgICAiMiIgfiAiQ29UIiwKICAgICAgICAgICIzIiB+ICJSQUciLAogICAgICAgICAgIjQiIH4gIkNvVHhSQUciLAogICAgICAgICAgLmRlZmF1bHQgPSBhcy5jaGFyYWN0ZXIodHJlYXRtZW50KQogICAgICAgICAgKSwKICAgICAgICB0cmVhdG1lbnQgPSBmYWN0b3IoCiAgICAgICAgICB0cmVhdG1lbnQsCiAgICAgICAgICBsZXZlbHMgPSBjKCJWYW5pbGxhIiwgIkNvVCIsICJSQUciLCAiQ29UeFJBRyIpCiAgICAgICAgKQogICAgICAgICkKICAgICAgCn0pCgphbmFseXNpc19saXN0X2ZhY3Rvcl9tZWFuX2NvbHNbMV0KYGBgCgpUaGlzIHRyYW5zZm9ybWVkIGFuZCBieSBtZWFucyBleHBhbmRlZCBsaXN0IG9mIHRoZSBpbXB1dGVkIGZhY3RvciBpdGVtcyBoYXMgdG8gYmUgdHJhbnNmb3JtZWQgYmFjayBpbnRvIGFuIG1pZHMgb2JqZWN0IGZvciB0aGUgbGF0dGVyIHBvc3QtY2hlY2sgZmFjdG9yaWFsIEFOT1ZBIHdoaWNoIGNhbiBiZSBhcHBsaWVkIHRvIG1pcmEgb2JqZWN0cyAoUm9iaXR6c2NoIGV0IGFsLiwgMjAyNSkuIEFzIHN0YXRlZCBiZWZvcmUgZm9yIHRoZSBvcmRpbmFsIENGQSwgdXNpbmcgdGhlIG1pZHMgb2JqZWN0IGVuc3VyZXMgdGhhdCB0aGUgc3RhbmRhcmQgZXJyb3JzIGFzIHdlbGwgYXMgZnVydGhlciBzdGF0aXN0aWNhbCBtZWFzdXJlcyBpbmZsdWVuY2VkIGJ5IG11bHRpcGxlIGltcHV0YXRpb24gYXJlIGNvbnNpZGVyZWQgaW4gdGVybXMgb2YgYSBtaXJhIG9iamVjdCAoVmFuIEJ1dXJlbiwgMjAxMSkuCgpgYGB7cn0KbWlkc19hbmFseXNpc19mYWN0b3JfbWVhbl9jb2xzIDwtIGRhdGxpc3QybWlkcyhhbmFseXNpc19saXN0X2ZhY3Rvcl9tZWFuX2NvbHMpCmdsaW1wc2UobWlkc19hbmFseXNpc19mYWN0b3JfbWVhbl9jb2xzWzFdKQpgYGAKCjxoMT5EZXNjcmlwdGl2ZSBTdGF0aXN0aWNzPC9oMT4KQmVmb3JlIHN0YXJ0aW5nIHRoZSBNQU5PVkEgYW5hbHlzaXMsIHRoZSBpbml0aWFsIHN0ZXAgcmVsaWVzIGluIGFuYWx5emluZyB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyAoS2FuZyBhbmQgSmluLCAyMDE2KS4gRmlyc3QsIGJveHBsb3RzIGFyZSBnZW5lcmF0ZWQgdG8gZXN0YWJsaXNoIGEgZm91bmRhdGlvbiBmb3IgYW4gYWR2YW5jZWQgYW5hbHlzaXMgdXNpbmcgZGVzY3JpcHRpdmUgc3RhdGlzdGljIG1lYXN1cmVzIHN1Y2ggYXMgbWVhbiBhbmQgaXRzIGxvd2VyIGFuZCB1cHBlciBjb25maWRlbmNlIGludGVydmFscy4gVGhpcyBvdmVyYWxsIGRlc2NyaXB0aXZlIGFuYWx5c2lzIGxheXMgdGhlIGdyb3VuZCBmb3IgdGhlIE1BTk9WQSBhbmFseXNpcy4KCjxoMj5JbnRlcnByZXRhdGluZyB0aGUgT3ZlcmFsbCBUZW5kZW5jeSB3aXRoIEJveHBsb3RzPC9oMj4KQm94cGxvdHMgYXJlIGdlbmVyYXRlZCBmb3IgcHJlLWV2YWx1YXRpbmcgdGVuZGVuY2llcyBzdWNoIGFzIG1lZGlhbiBkaWZmZXJlbmNlcyBhbW9uZyB0cmVhdG1lbnQgZ3JvdXBzIChWb24gRXllIGFuZCBXaWVkZXJtYW5uLCAyMDIzKSwgd2hpY2ggYXJlIGRlZXBlciBhbmFseXplZCB1c2luZyB0aGUgbGF0ZXIgb24gY2FsY3VsYXRlZCBkZXNjcmlwdGl2ZSBzdGF0aWMgbWV0cmljcywgZS5nLiwgdGhlIG1lYW4uIEZvciBjbGFyaXR5IHJlYXNvbnMsIHRoZSBsaXN0ICJhbmFseXNpc19saXN0X2ZhY3Rvcl9tZWFuX2NvbHMiIGluIHdoaWNoIHRoZSB0cmVhdG1lbnQgY29sdW1uIGlzIHJlY29kZWQgKDEgPSBWYW5pbGxhLCAuLi4pIGlzIHVzZWQuIAoKRmlyc3QsIGZvciBlYWNoIGltcHV0ZWQgZGF0YXNldCB0aGUgcGxvdHMgYXJlIGdlbmVyYXRlZC4gSG93ZXZlciwgdG8gYXZvaWQgYW5hbHl6aW5nIDEwIGRpZmZlcmVudCBidXQgc2ltaWxhciBwbG90cyBmb3IgZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUsIGFsbCAxMCBpbXB1dGVkIGRhdGFzZXRzIGFyZSBzdW1tYXJpemVkIGludG8gb25lIGZvciBhIHF1aWNrIGV4cGxvcmF0aW9uLiBUaGUgcmVzdWx0aW5nIGZvdXIgc3VtbWFyeSBib3hwbG90cyBhcmUgYXJyYW5nZWQgYW5kIGFuYWx5emVkIHRvZ2V0aGVyLiBBcyB0aGUgbGF0ZXIgZGVwaWN0ZWQgdGFibGUgc2VydmVzIGFzIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGl2ZSBzdGF0aXN0aWMsIHRoZSBhY2NvbXBhbnlpbmcgYmx1cnJpbmcgb2YgdGhlIGJveHBsb3RzIGlzIGFja25vd2xlZGdlZCBhbmQgYWNjZXB0ZWQuIE1vcmVvdmVyLCBib3hwbG90cyBhcmUgaW50ZW5kZWQgdG8gZXhwbG9yZSB0aGUgbWVkaWFuLCBxdWFydGlsZXMsIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGFuZCB0aHVzLCB0aGUgb3ZlcmFsbCB0ZW5kZW5jeSBvZiB0aGUgZGF0YSBidXQgbm90IFNFcyBhbmQgb3RoZXIgc3RhdGlzdGljYWwgbWVhc3VyZXMgdGhhdCBhcmUgaW1wYWN0ZWQgYnkgdGhlIHByb2NlZHVyZSBvZiBtdWx0aXBsZSBpbXB1dGF0aW9uIChWYW4gQnV1cmVuLCAyMDExOyBTZWx0bWFuLCAyMDE4KS4KCmBgYHtyfQphYzAxX3Bsb3QgPC0gbGFwcGx5KGFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29scywgZnVuY3Rpb24oZGYpIHsKICBnZ3Bsb3QoZGYsIGFlcyh0cmVhdG1lbnQsIEFDMDFfU0NPUkUsIGNvbG9yPXRyZWF0bWVudCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X2JveHBsb3QoZ2VvbT0nZXJyb3JiYXInLGNvZWY9NSkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKyB5bGltKDEsIDUpCn0pCgphYzAxX3Bsb3QKYGBgCgpgYGB7cn0KZGkwMV9wbG90IDwtIGxhcHBseShhbmFseXNpc19saXN0X2ZhY3Rvcl9tZWFuX2NvbHMsIGZ1bmN0aW9uKGRmKSB7CiAgZ2dwbG90KGRmLCBhZXModHJlYXRtZW50LCBESTAxX1NDT1JFLCBjb2xvcj10cmVhdG1lbnQpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9ib3hwbG90KGdlb209J2Vycm9yYmFyJyxjb2VmPTUpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsgeWxpbSgxLCA1KQp9KQoKZGkwMV9wbG90CmBgYAoKYGBge3J9CnVpMDFfcGxvdCA8LSBsYXBwbHkoYW5hbHlzaXNfbGlzdF9mYWN0b3JfbWVhbl9jb2xzLCBmdW5jdGlvbihkZikgewogIGdncGxvdChkZiwgYWVzKHRyZWF0bWVudCwgVUkwMV9TQ09SRSwgY29sb3I9dHJlYXRtZW50KSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfYm94cGxvdChnZW9tPSdlcnJvcmJhcicsY29lZj01KSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArIHlsaW0oMSwgNSkKfSkKCnVpMDFfcGxvdApgYGAKCmBgYHtyfQpleDAxX3Bsb3QgPC0gbGFwcGx5KGFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29scywgZnVuY3Rpb24oZGYpIHsKICBnZ3Bsb3QoZGYsIGFlcyh0cmVhdG1lbnQsIEVYMDFfU0NPUkUsIGNvbG9yPXRyZWF0bWVudCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X2JveHBsb3QoZ2VvbT0nZXJyb3JiYXInLGNvZWY9NSkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKyB5bGltKDEsIDUpCn0pCgpleDAxX3Bsb3QKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Nn0KYW5hbHlzaXNfc3VtbWFyeV9kZiA8LSBiaW5kX3Jvd3MoYW5hbHlzaXNfbGlzdF9mYWN0b3JfbWVhbl9jb2xzKQoKc3VtX2FjMDFfcGxvdCA8LSBnZ3Bsb3QoYW5hbHlzaXNfc3VtbWFyeV9kZiwgYWVzKHRyZWF0bWVudCwgQUMwMV9TQ09SRSwgY29sb3I9dHJlYXRtZW50KSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfYm94cGxvdChnZW9tPSdlcnJvcmJhcicsY29lZj01KSArICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKyB5bGltKDEsIDUpCgpzdW1fZGkwMV9wbG90IDwtIGdncGxvdChhbmFseXNpc19zdW1tYXJ5X2RmLCBhZXModHJlYXRtZW50LCBESTAxX1NDT1JFLCBjb2xvcj10cmVhdG1lbnQpKSArIGdlb21fYm94cGxvdCgpICsgc3RhdF9ib3hwbG90KGdlb209J2Vycm9yYmFyJyxjb2VmPTUpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsgeWxpbSgxLCA1KQoKc3VtX3VpMDFfcGxvdCA8LSBnZ3Bsb3QoYW5hbHlzaXNfc3VtbWFyeV9kZiwgYWVzKHRyZWF0bWVudCwgVUkwMV9TQ09SRSwgY29sb3I9dHJlYXRtZW50KSkgKyBnZW9tX2JveHBsb3QoKSArIHN0YXRfYm94cGxvdChnZW9tPSdlcnJvcmJhcicsY29lZj01KSArIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArIHlsaW0oMSwgNSkKCnN1bV9leDAxX3Bsb3QgPC0gZ2dwbG90KGFuYWx5c2lzX3N1bW1hcnlfZGYsIGFlcyh0cmVhdG1lbnQsIEVYMDFfU0NPUkUsIGNvbG9yPXRyZWF0bWVudCkpICsgZ2VvbV9ib3hwbG90KCkgKyBzdGF0X2JveHBsb3QoZ2VvbT0nZXJyb3JiYXInLGNvZWY9NSkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKyB5bGltKDEsIDUpCgoKc3VtX29mX2FsbCA8LSBnZ2FycmFuZ2Uoc3VtX2FjMDFfcGxvdCwgc3VtX2RpMDFfcGxvdCwgc3VtX3VpMDFfcGxvdCwgc3VtX2V4MDFfcGxvdCwgbmNvbD0yLCBucm93PTIsIGNvbW1vbi5sZWdlbmQgPSBUUlVFLCBsZWdlbmQgPSAicmlnaHQiKQpzdW1fb2ZfYWxsCmBgYAoKQXMgdGhlIHF1ZXN0aW9ubmFpcmUgb25seSBhbGxvd3MgdG8gYW5zd2VyIG9uIGEgTGlrZXJ0IHNjYWxlIDEtNSBvcmRpbmFsIHJlc3BvbnNlIGZvcm1hdCB3aXRoIDEgaW5kaWNhdGluZyB0aGUgaGlnaGVzdCBkaXNhZ3JlZW1lbnQgYW5kIDUgaW4gcmV2ZXJzZSwgdGhlIG1lZGlhbnMgYW5kIHZhbHVlcyBpbnRlcnByZXRlZCBiZWxvdyBhcmUgcm91bmRlZCwgaS5lLiwgMi41IOKJiCAzLgoKRm9yIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgb2YgYWNjb3VudGFiaWxpdHkgKEFDMDFfU0NPUkUpLCBhIGNvbW1vbiBtZWRpYW4gb2YgNCBpcyBvYnNlcnZlZC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbGwgdHJlYXRtZW50cyBhcmUgbGlrZWx5IHRvIGFjaGlldmUgYSBoaWdoIGFjY291bnRhYmlsaXR5IGZyb20gYSB1c2VyIHBvaW50IG9mIHZpZXcsIGkuZS4sIGFsbCB0cmVhdG1lbnRzIGludGVyYWN0IHdpdGggdGhlIHVzZXIgaW4gYSByYXRoZXIgbmV1dHJhbCwgYmVsaWV2aW5nLCBhbmQgcnVsZS1hY2NvbXBhbnlpbmcgd2F5LiBIb3dldmVyLCBmb3IgQ29UIGFuZCBDb1R4UkFHIHRoZSBtaW5pbXVtIHZhbHVlIHNpZ25pZmljYW50bHkgZGlzYWdyZWVzIHJlZmVycmluZyB0byBhIHRpbnkgc2hhcmUgb2YgdXNlcnMgZG8gbm90IGFncmVlIHRvIHRoZSBtZWRpYW4gYXQgYWxsLiBGb3IgYWxsIGZvdXIgdHJlYXRtZW50cywgdGhlIHZhbHVlcyBhcmUgY29uY2VudHJhdGVkIGFyb3VuZCA0ICgzIC0gNSkgLSB3aGljaCBvdmVyYWxsIGFncmVzcyB3aXRoIHRoZSBtZWRpYW4uCgpUaGUgc2Vjb25kIGRlcGVuZGVudCB2YXJpYWJsZSwgZGlzY2xvc3VyZSAoREkwMV9TQ09SRSksIHZhcmllcyBicm9hZGx5IGNvbXBhcmVkIHRvIHRoZSBwcmlvciBvdXRsaW5lZCB2YXJpYWJsZSBhcyB0aGUgbWVkaWFuIG9mIFJBRyBhbmQgQ29UeFJBRyBpcyA0IHdoZXJlYXMgVmFuaWxsYSdzIGFuZCBDb1QncyBtZWRpYW4gaXMgMS4gQWNjb3JkaW5nbHksIFJBRy1iYXNlZCB0cmVhdG1lbnRzIGFyZSBtb3JlIGxpa2VseSB0byBiZSBwZXJjZWl2ZWQgYXMgZGlzY2xvc2luZyBzb3VyY2VzIGFuZCBhZGRpdGlvbmFsIGNvbnRlbnQgdGhhbiBWYW5pbGxhIG9yIENvVCB0cmVhdG1lbnRzLiBIb3dldmVyLCBhIG1heGltdW0gdmFsdWUgb2YgNSBmb3IgdGhlIGxhdHRlciBib3RoIGluZGljYXRlIHRoYXQgaXQgaXMgbm90IHVubGlrZWx5IGF0IGFsbCB0aGF0IHRob3NlIHR3byB0cmVhdG1lbnRzIGFyZSBwZXJjZWl2ZWQgZGlzY2xvc2luZywgdG9vLiBJbiBjb250cmFzdCwgUkFHJ3MgYW5kIENvVHhSQUcncyBtaW5pbXVtIHZhbHVlcyBhcmUgMiBhbmQgMyBpbmRpY2F0aW5nIHRoYXQgdXNlcnMgYXJlIHZlcnkgbGlrZWx5IHRvIHBlcmNlaXZlIHRob3NlIHRyZWF0bWVudHMgYXQgbGVhc3QgYSBiaXQgZGlzY2xvc2luZy4gVG8gY29uY2x1ZGUsIHRoZSB2YWx1ZXMgZm9yIFZhbmlsbGEgYW5kIENvVCBhcmUgbGVzcyBkaXNwZXJzZWQgdGhhbiB0aGUgdmFsdWVzIGZvciBSQUcgYW5kIENvVHhSQUcgcmVmZXJyaW5nIGEgaGlnaGVyIGFncmVlbWVudCBhbW9uZyByZXNwb25kZW50cyBvZiB0aGUgbGF0dGVyIHR3byB0cmVhdG1lbnRzLgoKVXNlZnVsbmVzcyBvZiBpbmZvcm1hdGlvbiAoVUkwMV9TQ09SRSkgYXMgdGhlIHRoaXJkIGRlcGVuZGVudCB2YXJpYWJsZSwgYWNoaWV2ZXMgYSBoaWdoZXIgYWdyZWVtZW50IGFjcm9zcyBhbGwgZm91ciB0cmVhdG1lbnRzIHdpdGggYSBtZWRpYW4gb2YgNSBhbmQgYSBzaW1pbGFyIGRpc3BlcnNpb24gb2YgdmFsdWVzIG9mIDMgLSA1LiBDb25zZXF1ZW50bHksIGFsbCB1c2VycyBhcmUgbGlrZWx5IHRvIGFncmVlIHRoYXQgYWxsIHRyZWF0bWVudCdzIGxlYWQgdG8gdXNlZnVsIGluZm9ybWF0aW9uIHRoYXQgY29udGFpbnMgdGhlIG1vc3QgaW1wb3J0YW50IHBvaW50cyBvZiBhIHVzZXIncyByZXF1ZXN0IGluIGFuIHVuZGVyc3RhbmRhYmxlIHdheS4KCkZpbmFsbHksIHRoZSB0ZW5kZW5jeSBvZiB0aGUgbGFzdCBkZXBlbmRlbnQgdmFyaWFibGUgb2YgZXhwbGFpbmFiaWxpdHkgKEVYMDFfU0NPUkUpIGlzIGNvbmR1Y3RlZC4gSGVyZSBhZ2FpbiBtb3JlIHZhcnlpbmcgbWVkaWFucyBhcmUgb2JzZXJ2ZWQgYXMgYWxsIHRyZWF0bWVudHMgaGF2ZSBhIG1lZGlhbiBvZiAyIGV4Y2VwdCBmb3IgQ29UeFJBRyB3aGljaCBpbmhlcml0cyBhIG1lZGlhbiBvZiAzLiBTaW1pbGFyIHRvIGRpc2Nsb3N1cmUgdGhhdCB2YWx1ZXMgYXJlIHNwcmVhZCBhY3Jvc3MgYWxsIHBvc3NpYmxlIHZhbHVlcyAxIC0gNS4gQWx0aG91Z2ggdGhlIG1heGltdW0gdmFsdWUgb2YgQ29UIHdoaWNoIGlzIDQgaW5kaWNhdGVzIHRoYXQgQ29UIGlzIG1vcmUgbGlrZWx5IHRvIGJlIHBlcmNlaXZlZCBsZXNzIGV4cGxhaW5hYmxlIHRoYW4gdGhlIG90aGVycywgaS5lLiwgYWxsb3dpbmcgdG8gdHJhY2UgaXRzIGFyZ3VtZW50YXRpb24gYW5kIHRvIHJlYWN0IG9uIHRoZSB1c2VyJ3MgZGVtYW5kcy4gSW4gY29udHJhc3QgdG8gdGhlIG90aGVycywgQ29UeCBSQUcgaXMgbW9yZSBzcHJlYWQgYXJvdW5kIDMgd2hpY2ggZXhwbGFpbnMgaXRzIGhpZ2hlciBtZWRpYW4uIENvbnNlcXVlbnRseSwgaXQgaXMgbW9yZSBsaWtlbHkgdG8gYmUgcGVyY2VpdmVkIG1vcmUgZXhwbGFpbmFibGUgdGhhbiB0aGUgb3RoZXIgdHJlYXRtZW50cy4gSXQgaGFzIHRvIGJlIG5vdW5lZCB0aGF0IGEgdmFsdWUgb2YgMyBpbmRpY2F0ZXMgbmVpdGhlciBhIGhpZ2ggbm9yIGEgbG93IGV4cGxhaW5hYmlsaXR5LiBUaGVyZWJ5LCBldmVuIHRob3VnaCBDb1R4UkFHIGlzIG1vcmUgbGlrZWx5IHRvIGhhdmUgYSBoaWdoZXIgZXhwbGFpbmFibGlsaXR5IHRoYW4gdGhlIG90aGVyIHRyZWF0bWVudHMsIGl0IGlzIGxpa2VseSB0byBiZSBvbmx5IG1vZGVyYXRlbHkgZXhwbGFpbmFibGUgaW4gdGhlIGVuZC4KCgoKPGgyPkNhbGN1bGF0aW9uIGFuZCBJbnRlcnByZXRhdGlvbiBvZiBEZXNjcmlwdGl2ZSBTdGF0aXN0aWMgTWV0cmljczwvaDI+CkJhc2VkIG9uIHRoZSBwcmV2aW91cyBvdXRjb21lcywgd2UgYW5hbHl6ZSB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljIG1ldHJpY3MuIEhlcmVieSwgYSBzaWduaWZpY2FuY2UgbGV2ZWwgYWxwaGEgb2YgMC4wNSBpcyBhc3N1bWVkLiBXZSBzdGFydCB3aXRoIGRlcGljdGluZyBhIHRhYmxlIHRoYXQgY29udGFpbnMgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gb2YgZWFjaCBmYWN0b3I6IAo8dWw+CjxsaT5HZW5lcmFsIGluZm9ybWF0aW9uOiBzYW1wbGUgc2l6ZSAoTiksPC9saT4KPGxpPkNlbnRyYWwgdGVuZGVuY3kgaW5mb3JtYXRpb24gYW5kIGNlbnRyYWwgZGlzcGVyc2lvbjoKPHVsPgo8bGk+bWVhbiw8L2xpPgo8bGk+bG93ZXIgYW5kIHVwcGVyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKENJKSBvZiB0aGUgbWVhbiw8L2xpPgo8bGk+c3RhbmRhcmQgZXJyb3IgKFNFKSw8L2xpPgo8bGk+bWVkaWFuLDwvbGk+CjxsaT5tb2RlLDwvbGk+CjwvdWw+CjwvbGk+CjxsaT5GdXJ0aGVyIGRpc3BlcnNpb24gaW5mb3JtYXRpb246Cjx1bD4KPGxpPnN0YW5kYXJkIGRldmlhdGlvbiAoU0QpLDwvbGk+CjxsaT52YXJpYW5jZSw8L2xpPgo8bGk+dGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUuPC9saT4KPC91bD4KPC9saT4KPC91bD4KClRoZSBtZXRyaWNzIGFyZSBkZXRlcm1pbmVkIGluIHR3byBzdGVwcyBpbiBvcmRlciB0byB0YWtlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpbXB1dGVkIGRhdGEgaW50byBhY2NvdW50LiBXaGVyZWFzIHRoZSBOIG9mIGVhY2ggdHJlYXRtZW50IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHNpbXBseSBjb3VudGluZyB0aGUgcm93cyBvZiBhIHRyZWF0bWVudCwgdGhlIG1lYW4gYW5kIFNEIGFyZSBhc2NlcnRhaW5lZCBieSB1c2luZyBhIG1ldGhvZCBvZiB0aGUgIm1pY2VhZGRzIiBwYWNrYWdlIHRoYXQgYWxsb3dzIHRvIGRpcmVjdGx5IGNhbGN1bGF0ZSB0aGVzZSBtZXRyaWNzIG9uIHRoZSBmb3VuZGF0aW9uIG9mIGltcHV0ZWQgZGF0YSAoUm9iaXR6c2NoIGV0IGFsLiwgMjAyNSkuIE1lYW4gYW5kIFNEIGVzdGFibGlzaCB0aGUgZ3JvdW5kIGZvciBmdXJ0aGVyIG1ldHJpYyBjYWxjdWxhdGlvbnMsIGkuZS4sIHRoZSBzZWNvbmQgc3RlcC4gSG93ZXZlciwgUm9iaXR6c2NoIGV0IGFsLiAoMjAyNSkgZG8gbm90IG1lbnRpb24gaW4gd2hpY2ggd2F5IHRoZSBTRSwgY29uZmlkZW5jZSBpbnRlcnZhbHMgYW5kIHAgdmFsdWVzIG9mIHRoZSBtdWx0aXBsZSBpbXB1dGF0aW9uIGlzIGNvbnNpZGVyZWQuIEFzIHRoZSBtZXRob2Qgc3VnZ2VzdGVkIGJ5IFJvYml0enNjaCBldCBhbC4gKDIwMjUpIGlzIHByaW1hcmx5IHVzZWQgZm9yIHdlaWdodGVkIGRhdGFzZXRzLCB3ZSBhc3N1bWUgdGhhdCB0aGUgaW1wYWN0IG9mIG11bHRpcGxlIGltcHV0YXRpb24gb24gdGhlIHByaW9yIG1lbnRpb25lZCBtZXRyaWNzIGlzIG5vdCBjb25zaWRlcmVkIGZ1bGx5LgoKVGhlIHZhcmlhbmNlIGlzIGNhbGN1bGF0ZWQgb24gdGhlIGJhc2lzIG9mIHRoZSBTRCBhcyB0aGUgU0QgaXMgdGhlIHF1YWRyYXRpYyBzcXVhcmUgcm9vdCBvZiB0aGUgdmFyaWFuY2UuIE1vcmVvdmVyLCB0aGUgU0UgaXMgY2FsY3VsYXRlZCBieSBkaXZpZGluZyB0aGUgU0QgYnkgdGhlIHNxdWFyZSByb290IG9mIGEgdHJlYXRtZW50J3MgTi4gVGhlIGxvd2VyIGFuZCB1cHBlciBjb25maWRlbmNlIGludGVydmFscyBjYW4gYmUgYXNjZXJ0YWluZWQgYnkgc3VidHJhY3RpbmcvYWRkaW5nIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGUgei1zY29yZXMgb2YgInRoZSAyLjUlIGFuZCA5Ny41JSBxdWFudGlsZXMgb2YgYSBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uIFsrLSAxLjk2XSIgKEthbHRlbmJhY2gsIDIwMjEsIHAuIDI1KSB3aXRoIHRoZSBTRS4gKEthbHRlbmJhY2gsIDIwMjEpCgpGdXJ0aGVybW9yZSwgdHdvIGFkZGl0aW9uYWwgY2VudHJhbCB0ZW5kZW5jeSBtZXRyaWNzIGFyZSBjYWxjdWxhdGVkOiBtZWRpYW4gYW5kIG1vZGUuIFRoZSBtZWRpYW4gInNwbGl0cyB0aGUgZGlzdHJpYnV0aW9uIGluIGhhbGYgWy4uLl0gW3dpdGggYSA1MCAlXSBjaGFuY2Ugb2YgYSByYW5kb20gdmFsdWUgWy4uLl0gb2NjdXJyaW5nIGFib3ZlIG9yIGJlbG93IHRoZSBtZWRpYW4uIiAoU2VsdG1hbiwgMjAxOCwgcC4gMzcpLiBFdmVuIHRob3VnaCB0aGlzIGlzIGEgY29tbW9uIG1ldHJpYywgdGhlIG1lYW4gaXMgdGhlIG1vcmUgZnJlcXVlbnRseSB1c2VkIG1ldHJpYyBmb3IgY2VudHJhbCB0ZW5kZW5jeSBkZXBpY3RpbmcgdGhlICIoZXhwZWN0ZWQgdmFsdWUpIG9mIGEgcmFuZG9tIHZhcmlhYmxlIiAoU2VsdG1hbiwgMjAxOCwgcC4gMzcpLiBJbiBjb250cmFzdCB0byB0aGVzZSB0d28gbWV0cmljcywgdGhlIG1vZGUgYXMgInRoZSBtb3N0IFsuLi5dIGZyZXF1ZW50bHkgb2NjdXJyaW5nIHZhbHVlIiAoU2VsdG1hbiwgMjAxOCwgcC4gNjgpIGlzIHJhdGhlciBzZWxkb20gdXNlZCBpbiBwcmFjdGljZS4gQWxsIHRoZXNlIG1ldHJpY3MgZXN0YWJsaXNoIGEgaG9saXN0aWMgcGljdHVyZSBvbiBlYWNoIHRyZWF0bWVudHMgY2VudHJhbCB0ZW5kZW5jeSBhbmQgdGh1cywgYXJlIGNhbGN1bGF0ZWQgYmVsb3cuIChTZWx0bWFuLCAyMDE4KQoKVGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIG9mIGVhY2ggdHJlYXRtZW50IGFyZSBhbHNvIHByb3ZpZGVkIHRvIHNob3cgdGhlIG1heGltdW0gdGhlIGRpc3BlcnNpb24gb2YgdmFsdWVzLgoKRm9yIHRoZSBjYWxjdWxhdGlvbiBvZiBtZWRpYW4sIG1vZGUgYW5kIG1pbi9tYXggdmFsdWVzLCBSdWJpbidzIHJ1bGVzIG9mIHBvb2xpbmcgYXJlIG5vdCBjb25zaWRlcmVkIGFzIG5vIHByZWRlZmluZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBpbXB1dGVkIGRhdGEgcHJvcGVydGllcyBpbnRvIGFjY291bnQgaXMgdXNlZCAoVmFuIEJ1dXJlbiwgMjAxMSksIGUuZy4sIGFzIGZ1bmN0aW9ucyBvZiB0aGUgIm1pY2VhZGRzIiBwYWNrYWdlIChSb2JpdHpzY2ggZXQgYWwuLCAyMDI1KS4gQnV0IGFzIHRob3NlIG1ldHJpY3MgYXJlIG9ubHkgdXNlZCBmb3IgaW50ZXJwcmV0aW5nIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGFuZCBub3Qgb25nb2luZ2x5LCB0aGlzIGxpbWl0YXRpb24gaXMgYWNrbm93bGVkZ2VkIGFuZCBhY2NlcHRlZC4gVGhlIG1ldHJpY3MgYXJlIGNhbGN1bGF0ZWQgZm9yIGEgY29tYmluZWQgZGF0YXNldCBjb25zaXN0aW5nIG9mIGFsbCByb3dzIG9mIGVhY2ggaW1wdXRlZCBkYXRhc2V0IGZvciBlYWNoIHRyZWF0bWVudCwgaS5lLiwgaWYgYSB0cmVhdG1lbnQgb2NjdXJzIDM2IHRpbWVzLCBpdCBoYXMgMzYgcm93cyBwZXIgaW1wdXRlZCBkYXRhc2V0IC0gYXMgMTAgaW1wdXRlZCBkYXRhc2V0cyBhcmUgY29uc3RydWN0ZWQsIDM2MCByb3dzIGFyZSBjb25zaWRlcmVkIGZvciBtZWRpYW4sIG1vZGUsIG1pbi9tYXggY2FsY3VsYXRpb24uCgpBcyBhIGZvdW5kYXRpb24gdGhlIGxpc3QgImxpc3RfZmFjdG9yX21lYW5fY29scyIgb2YgaW1wdXRlZCBkYXRhc2V0IGlzIHVzZWQgYXMgYW4gZW5jb2RlZCB0cmVhdG1lbnQsIGkuZS4sIDE6NCBpbnN0ZWFkIG9mICJWYW5pbGxhIjoiQ29UeFJBRyIsIGRlY3JlYXNlcyB0aGUgcG90ZW50aWFsIGZvciBlcnJvcnMgZHVlIHRvIHR5cGUgZGlmZmVyZW5jZXMsIGUuZy4sIGNoYXJhY3RlciB0byBkb3VibGUuCgpgYGB7cn0KcmVsZXZhbnRfdmFycyA9IGMoIkFDMDFfU0NPUkUiLCAiREkwMV9TQ09SRSIsICJVSTAxX1NDT1JFIiwgIkVYMDFfU0NPUkUiKQoKaW5pdGlhbF9kZXNjcmlwdGl2ZV9zdGF0cyA8LSBtYXBfZGZyKDE6NCwgZnVuY3Rpb24oY3VycmVudF90cmVhdG1lbnQpIHsKICAKICB0cmVhdG1lbnRfc3Vic2V0IDwtIGxhcHBseSgKICAgIGxpc3RfZmFjdG9yX21lYW5fY29scywgCiAgICBmdW5jdGlvbihkZikgZGYgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIodHJlYXRtZW50ID09IGN1cnJlbnRfdHJlYXRtZW50KSAlPiUKICAgICAgICBkcGx5cjo6c2VsZWN0KHRyZWF0bWVudCwgQUMwMV9TQ09SRSwgREkwMV9TQ09SRSwgVUkwMV9TQ09SRSwgRVgwMV9TQ09SRSkKICApCiAgCiAgZ2xpbXBzZSh0cmVhdG1lbnRfc3Vic2V0KQogIAogICMgVHJhbnNmb3JtaW5nIHRoZSBzdWJzZXQgbGlzdCBpbnRvIGEgbWlkcyBmb3IgZm9sbG93dXAgbWV0aG9kcyAobWEud3RkLikKICBtaWRzX3RyZWF0bWVudF9zdWJzZXQgPC0gZGF0bGlzdDJtaWRzKHRyZWF0bWVudF9zdWJzZXQpCiAgCiAgIyBDaGVja2luZyB0aGUgTgogIE5fb2ZfZWFjaF90cmVhdG1lbnRfcGVyX2ltcCA8LSBzYXBwbHkodHJlYXRtZW50X3N1YnNldCwgbnJvdykKICBOIDwtIG1lYW4oTl9vZl9lYWNoX3RyZWF0bWVudF9wZXJfaW1wKQoKICAjIERldGVybWluaW5nIHRoZSBtZXRyaWNzCiAgbWVhbiA8LSByb3VuZChtYS53dGQubWVhbk5BKAogICAgbWlkc190cmVhdG1lbnRfc3Vic2V0LCB2YXJzID0gcmVsZXZhbnRfdmFycyksIDIpCiAgU0QgPC0gcm91bmQobWEud3RkLnNkTkEobWlkc190cmVhdG1lbnRfc3Vic2V0LCB2YXJzID0gcmVsZXZhbnRfdmFycyksIDIpCiAgdmFyaWFuY2UgPC0gcm91bmQoKFNEICogU0QpLCAyKQogIFNFIDwtIHJvdW5kKChTRCAvIHNxcnQoTikpLCAyKQogIGxvd2VyX0NJIDwtIHJvdW5kKChtZWFuIC0gMS45NiAqIFNFKSwgMikKICB1cHBlcl9DSSA8LSByb3VuZCgobWVhbiArIDEuOTYgKiBTRSksIDIpCiAgCiAgCiAgIyBDb21iaW5lIGFsbCByb3dzIG9mIGVhY2ggb2YgdGhlIDEwIGltcHV0ZWQgZGF0YXNldHMgaW50byBvbmUgZGF0YXNldCBmb3IgZWFjaCB0cmVhdG1lbnQgdG8gY2FsY3VsYXRlIG1lZGlhbiwgbW9kZSwgbWF4LCBtaW4gdmFsdWUKICB0cmVhdG1lbnRfc3Vic2V0X2NvbWJpbmVkIDwtIGJpbmRfcm93cyh0cmVhdG1lbnRfc3Vic2V0KQogIGdsaW1wc2UodHJlYXRtZW50X3N1YnNldF9jb21iaW5lZCkKICAKICAjIENhbGN1bGF0ZSBtZWRpYW4gdmFsdWUKICB0cmVhdG1lbnRfbWVkaWFuIDwtIHRyZWF0bWVudF9zdWJzZXRfY29tYmluZWQgJT4lIAogICAgc3VtbWFyaXNlKAogICAgICBhY3Jvc3MoCiAgICAgICAgYWxsX29mKHJlbGV2YW50X3ZhcnMpLCBsaXN0KG1lZGlhbiA9IH5tZWRpYW4oLngpKQogICAgICApCiAgICApCiAgICB0cmFuc3BvbmVkX21lZGlhbiA8LSBhcy5kYXRhLmZyYW1lKHQodHJlYXRtZW50X21lZGlhbikpCiAgICBjb2xuYW1lcyh0cmFuc3BvbmVkX21lZGlhbikgPC0gYygibWVkaWFuIikKICAKICAjIENhbGN1bGF0ZSBtb2RlIHZhbHVlCiAgdHJlYXRtZW50X21vZGUgPC0gdHJlYXRtZW50X3N1YnNldF9jb21iaW5lZCAlPiUgCiAgICBzdW1tYXJpc2UoCiAgICAgIGFjcm9zcygKICAgICAgICBhbGxfb2YocmVsZXZhbnRfdmFycyksIGxpc3QobW9kZSA9IH5Nb2RlKC54KSkKICAgICAgKQogICAgKQogICAgdHJhbnNwb25lZF9tb2RlIDwtIGFzLmRhdGEuZnJhbWUodCh0cmVhdG1lbnRfbW9kZSkpCiAgICBjb2xuYW1lcyh0cmFuc3BvbmVkX21vZGUpIDwtIGMoIm1vZGUiKQogIAogIAogICMgQ2FsY3VsYXRlIG1pbiB2YWx1ZQogIHRyZWF0bWVudF9taW4gPC0gdHJlYXRtZW50X3N1YnNldF9jb21iaW5lZCAlPiUgCiAgICBzdW1tYXJpc2UoCiAgICAgIGFjcm9zcygKICAgICAgICBhbGxfb2YocmVsZXZhbnRfdmFycyksIGxpc3QobWluX3ZhbHVlID0gfm1pbigueCkpCiAgICAgICkKICAgICkKICAgIHRyYW5zcG9uZWRfbWluIDwtIGFzLmRhdGEuZnJhbWUodCh0cmVhdG1lbnRfbWluKSkKICAgIGNvbG5hbWVzKHRyYW5zcG9uZWRfbWluKSA8LSBjKCJtaW5pbXVtIikKICAKICAjIENhbGN1bGF0ZSBtYXggdmFsdWUKICB0cmVhdG1lbnRfbWF4IDwtIHRyZWF0bWVudF9zdWJzZXRfY29tYmluZWQgJT4lIAogICAgc3VtbWFyaXNlKAogICAgICBhY3Jvc3MoCiAgICAgICAgYWxsX29mKHJlbGV2YW50X3ZhcnMpLCBsaXN0KG1heF92YWx1ZSA9IH5tYXgoLngpKQogICAgICApCiAgICApCiAgICB0cmFuc3BvbmVkX21heCA8LSBhcy5kYXRhLmZyYW1lKHQodHJlYXRtZW50X21heCkpCiAgICBjb2xuYW1lcyh0cmFuc3BvbmVkX21heCkgPC0gYygibWF4aW11bSIpCiAgCiAgIyBUcmFuc2Zvcm1pbmcgbWV0cmljcyBpbnRvIHRoZSBvdXRwdXQgZm9ybWF0IG9mIGEgZGYKICBvdXRwdXRfbWVhbiA8LSBhcy5kYXRhLmZyYW1lKG1lYW4pCiAgb3V0cHV0X3NkIDwtIGFzLmRhdGEuZnJhbWUoU0QpCiAgb3V0cHV0X3ZhciA8LSBhcy5kYXRhLmZyYW1lKHZhcmlhbmNlKQogIG91dHB1dF9uIDwtIGFzLmRhdGEuZnJhbWUoTikKICBvdXRwdXRfdHJlYXRtZW50X3NlIDwtIGFzLmRhdGEuZnJhbWUoU0UpCiAgb3V0cHV0X3RyZWF0bWVudF9sb3dlcl9DSSA8LSBhcy5kYXRhLmZyYW1lKGxvd2VyX0NJKQogIG91dHB1dF90cmVhdG1lbnRfdXBwZXJfQ0kgPC0gYXMuZGF0YS5mcmFtZSh1cHBlcl9DSSkKICBkZXBlbmRlbnRfdmFyaWFibGUgPC0gcmVsZXZhbnRfdmFycwoKICAjIENvbWJpbmluZyB0aGUgb3V0cHV0CiAgb3V0cHV0IDwtIGNiaW5kKGRlcGVuZGVudF92YXJpYWJsZSwgb3V0cHV0X21lYW4sIG91dHB1dF9zZCwgb3V0cHV0X3Zhciwgb3V0cHV0X24sIG91dHB1dF90cmVhdG1lbnRfc2UsIG91dHB1dF90cmVhdG1lbnRfbG93ZXJfQ0ksIG91dHB1dF90cmVhdG1lbnRfdXBwZXJfQ0ksIHRyYW5zcG9uZWRfbWVkaWFuLCB0cmFuc3BvbmVkX21vZGUsIHRyYW5zcG9uZWRfbWluLCB0cmFuc3BvbmVkX21heCkKICBvdXRwdXQkdHJlYXRtZW50IDwtIGN1cnJlbnRfdHJlYXRtZW50CiAgb3V0cHV0CiAgCn0pCgppbml0aWFsX2Rlc2NyaXB0aXZlX3N0YXRzCgpgYGAKClRoZSBhYm92ZSBjYWxjdWxhdGVkIHRhYmxlIGhhcyB0byBiZSBjbGVhbmVkIHVwIGZvciBpbnRlcnByZXRhdGlvbi4gVGhpcyBpbmNsdWRlcyBkcm9wcGluZyB0aGUgIi4uLjExIiBjb2x1bW4gd2hpY2ggZGVwaWN0cyBvbmx5IG9uZSBhbHRlcm5hdGl2ZSB2YWx1ZSBmb3IgbW9kZSBpbiByb3cgOC4gVG8gZW5oYW5jZSBhbiB1c2VyJ3MgdW5kZXJzdGFuZGluZywgdGhlIHRyZWF0bWVudCBjb2x1bW4gaXMgcmVjb2RlZCBpbnRvIGl0cyBkZXNjcmlwdGlvbnMsIGkuZS4sIDEgPSBWYW5pbGxhLCAyID0gQ29ULCAzID0gUkFHLCA0ID0gQ29UeFJBRy4gQmVzaWRlcywgdGhlIGNvbHVtbiBzZXF1ZW5jZSBpcyByZXN0cnVjdHVyZWQgZm9yIGltcHJvdmVkIGNsYXJpdHkgaW4gbGluZSB3aXRoIHRoZSBwcmV2aW91c2x5IG91dGxpbmVkIHNlcXVlbmNlLgoKYGBge3J9CmRlc2NyaXB0aXZlX3N0YXRzIDwtIGFzLmRhdGEuZnJhbWUoaW5pdGlhbF9kZXNjcmlwdGl2ZV9zdGF0cykKCiMgRHJvcCAiLi4uMTEiIGNvbHVtbgpkZXNjcmlwdGl2ZV9zdGF0cyA8LSBkcGx5cjo6c2VsZWN0KGRlc2NyaXB0aXZlX3N0YXRzLCAtMTQpCgojIFJlbG9jYXRlIGNvbHVtbnMKZGVzY3JpcHRpdmVfc3RhdHMgPC0gZGVzY3JpcHRpdmVfc3RhdHNbLCBjKDEsIDEzLCA1LCAyLCA3LCA4LCA2LCA5LCAxMCwgMywgNCwgMTEsIDEyKV0KCiMgUmVjb2RlIHRyZWF0bWVudCBmcm9tIG51bWJlcnMgaW50byBkZXNjcmlwdGlvbgpkZXNjcmlwdGl2ZV9zdGF0cyA8LSBkZXNjcmlwdGl2ZV9zdGF0cyAlPiUKICBtdXRhdGUoCiAgICB0cmVhdG1lbnQgPSBjYXNlX21hdGNoKAogICAgICB0cmVhdG1lbnQsIAogICAgICAxIH4gIlZhbmlsbGEiLAogICAgICAyIH4gIkNvVCIsCiAgICAgIDMgfiAiUkFHIiwKICAgICAgNCB+ICJDb1R4UkFHIiwKICAgICAgLmRlZmF1bHQgPSBhcy5jaGFyYWN0ZXIodHJlYXRtZW50KQogICAgICApCiAgICApCgpkZXNjcmlwdGl2ZV9zdGF0cwpgYGAKCkluIHByZXBhcmF0aW9uIGZvciBpbnRlcnByZXRhdGlvbiwgYWxzbyBhIGdyb3VwaW5nIGFnYWluc3QgdGhlIGRlcGVuZGVudCB2YXJpYWJsZXMgQUMwMSwgREkwMSwgVUkwMSwgRVgwMSBieSB0cmVhdG1lbnQgaXMgZXN0YWJsaXNoZWQuCgpgYGB7cn0KZGVzY3JpcHRpdmVfc3RhdHMgPC0gZGVzY3JpcHRpdmVfc3RhdHMgJT4lIAogIG11dGF0ZSgKICAgIGRlcGVuZGVudF92YXJpYWJsZSA9IGZhY3RvcigKICAgICAgZGVwZW5kZW50X3ZhcmlhYmxlLAogICAgICBsZXZlbHMgPSBjKCJBQzAxX1NDT1JFIiwgIkRJMDFfU0NPUkUiLCAiVUkwMV9TQ09SRSIsICJFWDAxX1NDT1JFIikKICAgICksCiAgICB0cmVhdG1lbnQgPSBmYWN0b3IoCiAgICAgIHRyZWF0bWVudCwKICAgICAgbGV2ZWxzID0gYygiVmFuaWxsYSIsICJDb1QiLCAiUkFHIiwgIkNvVHhSQUciKQogICAgKQogICkgJT4lCiAgYXJyYW5nZShkZXBlbmRlbnRfdmFyaWFibGUsIHRyZWF0bWVudCkKCmRlc2NyaXB0aXZlX3N0YXRzCmBgYAoKU2ltaWxhciBhcyB3aXRoIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYm94cGxvdHMsIHRoZSBtZXRyaWMgdmFsdWVzIGFyZSByb3VuZGVkIGR1ZSB0byB0aGVpciBMaWtlcnQgc2NhbGUgb3JkaW5hbCByZXNwb25zZSBmb3JtYXQgcmFuZ2luZyBmcm9tIDEgLSA1LiBBcyB3ZSBhc3N1bWUgdGhhdCB0aGUgaW1wYWN0IG9mIG11bHRpcGxlIGltcHV0YXRpb24gaXMgbm90IHN1ZmZpY2llbnRseSBjb25zaWRlcmVkIHdpdGhpbiB0aGUgY2FsY3VsYXRpb24gbWV0aG9kLCB3ZSBuZWVkIHRvIGFzc3VtZSB0aGF0IGJvdGggY29uZmlkZW5jZSBpbnRlcnZhbHMgYW5kIFNFcyBhcmUgYnJvYWQgYW5kIGhpZ2hlciB0aGFuIGRlcGljdGVkLiBCZXNpZGVzLCB0aGUgU0QgYW5kIG5vdCB0aGUgdmFyaWFuY2UgYXMgaXRzIHNxdWFyZSBzdW0gaXMgaW50ZXJwcmV0ZWQuCgpBdCBhIGZpcnN0IGdsYW5jZSwgdGhlIHVuYmFsYW5jZWRuZXNzIG9mIHRoZSB0cmVhdG1lbnRzJyBOIGhhcyB0byBiZSBub3RlZCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGludHJvZHVjZWQgcHJldmlvdXNseS4gVGhpcyBpbXBhY3RzIHRoZSBsYXR0ZXIgTUFOT1ZBIGFuZCBBTk9WQXMgYW5kIGNhbm5vdCBiZSBkaXNyZWdhcmRlZC4KCkFzIHdpdGggdGhlIGJveHBsb3RzJyBpbnRlcnByZXRhdGlvbiwgd2UgYXJlIHN0YXJ0aW5nIHdpdGggdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvZiBhY2NvdW50YWJpbGl0eSAoQUMwMV9TQ09SRSkuIEVhY2ggdHJlYXRtZW50IHNoYXJlcyB0aGUgc2FtZSByb3VuZGVkIG1lYW4gb2YgNCBpbmRpY2F0aW5nIGFuIG92ZXJhbGwgc2FtcGxlIHRlbmRlbmN5IHRvd2FyZHMgYmVpbmcgbGlrZWx5IHRvIHBlcmNlaXZlIGEgaGlnaCBhY2NvdW50YWJpbGl0eSBmb3IgZWFjaCBvZiB0aGUgdHJlYXRtZW50cy4gVGhpcyBpcyB1bmRlcnBpbm5lZCBieSB0aGUgbG93ZXIgYW5kIHVwcGVyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdoaWNoIGFyZSByYXRoZXIgbmFycm93LiBBbHRob3VnaCwgdGhlIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwg4omIIDMuNDggb2YgQ29UeFJBRyBjYW4gbGVhZCBpbiBhdCBsZWFzdCBvbmUgb3V0IG9mIDk1ICUgY2FzZXMgdG8gYSBtZWFuIG9mIDMuIFRoZSBTRXMgYXJlIGNsb3NlIHRvIDAuMSBhbmQgdGh1cywgcmF0aGVyIGxvdyBpbmRpY2F0aW5nIGEgcHJlY2lzZSBlc3RpbWF0ZS4gQXMgb3V0bGluZWQgYmVmb3JlLCB0aGUgbWVkaWFuIGlzIGFyb3VuZCA0LiBGb3IgdGhlIG1vZGUsIFZhbmlsbGEgYWNoaWV2ZXMgdGhlIGhpZ2hlc3QgdmFsdWUgd2l0aCA1LCB3aGVyZWFzIHRoZSBvdGhlciB0cmVhdG1lbnRzIHJlbWFpbiBhdCA0LiBUaGlzIGluZGljYXRlcyB0aGF0IDUgaXMgdGhlIG1vc3Qgb2Z0ZW4gY2hvc2VuIHJhdGluZyBmb3IgVmFuaWxsYSBhbmQgdGh1cywgdGhhdCB0aGUgcmF0aW5ncyBhcmUgc3ByZWFkIGF0IGxlYXN0IGZyb20gMyB0byA1IGFzIDQgaXMgdGhlIG1lYW4uIFRoZSBsYXR0ZXIgaXMgdW5kZXJsaW5lZCBieSB0aGUgcHJldmlvdXMgYm94cGxvdCBvYnNlcnZhdGlvbnMgc3RhdGluZyB0aGF0IHRoZSB2YWx1ZXMgYXJlIGNvbmNlbnRyYXRlZCBhcm91bmQgNC4gQXMgdGhlIFNEIGlzIGJlbG93IDEsIHdlIGFzc3VtZSBhIG1vZGVyYXRlIGRpc3BlcnNpb24gb2YgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSBtZWFuIG9mIDQgLSBsZWFkaW5nIHJvdW5kZWQgdG8gYSB2YWx1ZSBvZiAzIG9yIDUuIEFsbCB0cmVhdG1lbnRzIHNoYXJlIHRoZSBzYW1lIG1heGltdW0gdmFsdWUgb2YgNSwgYnV0IG9ubHkgQ29UIGFuZCBDb1R4UkFHIGhhdmUgYSBjb21tb24gbWluaW11bSB2YWx1ZSBvZiAxIGluZGljYXRpbmcgYSBkaWZmZXJlbnQgcGVyY2VpdmVkIGFjY291bnRhYmlsaXR5IHdpdGhpbiBlYWNoIHRyZWF0bWVudCBncm91cC4gRm9yIFZhbmlsbGEsIHRoaXMgYXR0ZW51YXRlZCBieSBhIG1pbmltdW0gdmFsdWUgb2YgMi4gV2hlcmVhcyBmb3IgUkFHLCB0aGUgbWluaW11bSB2YWx1ZSBvZiAzIGluZGljYXRlcyBhIG1vZGVyYXRlIGFncmVlbWVudCBhbW9uZyB0aGUgcmVzcG9uZGVudHMgb2YgdGhlIHRyZWF0bWVudCBncm91cC4KCkNvbnRpbnVpbmcgd2l0aCBkaXNjbG9zdXJlIChESTAxX1NDT1JFKSB3aGVyZSB0aGUgbWVhbiB2YXJpZXMgc2lnbmlmaWNhbnRseSBmcm9tIFZhbmlsbGEgYW5kIENvVCBzaGFyaW5nIGEgbWVhbiBvZiAyIGNvbXBhcmVkIHRvIFJBRyBhbmQgQ29UeFJBRyB3aGljaCBzaGFyZSBhIG1lYW4gb2YgNC4gVGhpcyByZWZlcnMgdG8gdGhhdCB1c2VycyBhcmUgbW9yZSBsaWtlbHkgdG8gYXNzb2NpYXRlIFJBRyBhbmQvb3IgQ29UeFJBRyBhcyBkaXNjbG9zaW5nIHRoYW4gVmFuaWxsYSBhbmQgQ29ULiBGb3IgVmFuaWxsYSwgdGhlIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZXZlbiBzdWdnZXN0cyB0aGF0IGEgbWVhbiBvZiAxIGluZGljYXRpbmcgdGhhdCBWYW5pbGxhIG1pZ2h0IGJlIHBlcmNlaXZlZCBhcyBub24tZGlzY2xvc2luZyBhdCBhbGwgaXMgcG9zc2libGUuIEluIGNvbnRyYXN0LCB0aGUgb3RoZXIgbG93ZXIgYW5kIHVwcGVyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHVuZGVycGluIHRoZSByZXNwZWN0aXZlIG1lYW5zLiBUaGUgU0VzIGFyZSBjbG9zZSB0byAwLjEgYW5kIHRodXMsIHJhdGhlciBsb3cgaW5kaWNhdGluZyBhIHByZWNpc2UgZXN0aW1hdGUuIEluIGxpbmUgd2l0aCBwcmV2aW91cyBib3hwbG90IGZpbmRpbmdzIGEgbWVkaWFuIG9mIDEgZm9yIFZhbmlsbGEgYW5kIENvVCBhbmQgYSBtZWRpYW4gb2YgNCBmb3IgUkFHIGFuZCBDb1R4UkFHIGlzIHN1Z2dlc3RlZC4gVGhpcyBpcyBzdXBwb3J0ZWQgYnkgdGhlIG1vZGUgc2hhcmluZyB0aGUgc2FtZSB2YWx1ZXMgKDEgYW5kIDQpLiBIaWdoZXIgU0RzIGNvbXBhcmVkIHRvIHRoZSBTRHMgb2YgYWNjb3VudGFiaWxpdHkgaW5kaWNhdGUgYSBoaWdoZXIgZGlzcGVyc2lvbiBhcm91bmQgdGhlIG1lYW4sIGkuZS4sIHRoYXQgdmFsdWVzIG9mIFZhbmlsbGEsIENvVCBhbmQgUkFHIGRpZmZlciBieSArLSAxIGNvbXBhcmVkIHRvIHRoZWlyIG1lYW4uIFdoZXJlYXMgdmFsdWVzIG9mIENvVHhSQUcgYSByYXRoZXIgKyAxIGhpZ2hlciB0aGFuIHRoZWlyIG1lYW4uIEFsbCB0cmVhdG1lbnRzIHNoYXJlIHRoZSBzYW1lIG1heGltdW0gdmFsdWUgb2YgNSBpbmRpY2F0aW5nIGEgaGlnaCBkaXNwZXJzaW9uIGZvciBWYW5pbGxhIGFuZCBDb1Qgd2hpY2ggYWxzbyBzaGFyZSBhIG1pbmltdW0gdmFsdWUgb2YgMS4gRm9yIFJBRywgdGhlIGRpc3BlcnNpb24gaXMgYSBiaXQgbG93ZXIgd2l0aCBhIG1pbmltdW0gdmFsdWUgb2YgMi4gSW4gY29udHJhc3QsIHRoZSByZXNwb25kZW50cyBvZiBDb1R4UkFHIHRlbmQgdG8gYWdyZWUgbW9yZSB3aXRoIGEgbWluaW11bSB2YWx1ZSBvZiAzLgoKRm9yIHVzZWZ1bG5lc3MgKFVJMDFfU0NPUkUpLCB0aGUgbWVhbiBhY3Jvc3MgdHJlYXRtZW50cyBpcyByb3VuZGVkIHRvIDQgd2hpY2ggcG9pbnRzIG91dCB0aGF0IGFsbCB0cmVhdG1lbnRzIGJlaW5nIGxpa2VseSBwZXJjZWl2ZWQgYXMgdXNlZnVsLiBXaGVyZWFzIHdpdGggdGhlIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdGhlIG1lYW4gcmVtYWlucyBhdCA0LCB0aGUgdXBwZXIgY29uZmlkZW5jZSBpbnRlcnZhbCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGF0IGxlYXN0IGZvciBvbmUgb3V0IG9mIDk1ICUgY2FzZXMgYSBtZWFuIG9mIDUgY2FuIGJlIGV4cGVjdGVkIGZvciBhbGwgdHJlYXRtZW50cy4gVGhlIFNFIGlzIGxvd2VyIHRoYW4gZm9yIHRoZSBvdGhlciBkZXBlbmRlbnQgdmFyaWFibGVzIHJlZmVycmluZyB0aGF0IHRoZSBwcmVjaXNpb24gb2YgdGhlIGVzdGltYXRlIGlzIHRoZSBoaWdoZXN0LCByZWxhdGl2ZWx5LiBBIG1lZGlhbiBvZiA1IGZvciBhbGwgdHJlYXRtZW50cyBhZ3JlZXMgd2l0aCB0aGUgbWVhbiwgd2hlcmVhcyB0aGUgbW9kZSBhZ3JlZXMgaW4gYWxsIGV4Y2VwdCBvZiBvbmUgdHJlYXRtZW50cyAtIFJBRyB3aGVyZSBhIG1vZGUgb2YgNCBpcyBhY2hpZXZlZC4gQ29uc2VxdWVudGx5LCB0aGUgbXVzdCBhIGhpZ2ggYW1vdW50IG9mIDQgYW5kIDUgcmF0aW5ncyBmb3IgUkFHIHRvIGFjaGlldmUgcHJldmlvdXMgbWV0cmljIHZhbHVlcyBmb3IgdXNlZnVsbmVzcy4gRm9yIGFsbCB0cmVhdG1lbnRzIHRoZSBkaXNwZXJzaW9uIGFyb3VuZCB0aGUgbWVhbiBpcyByYXRoZXIgbG93IGFzIHRoZSB2YWx1ZXMgcmVtYWluIHJvdW5kZWQgYXQgNC4gVGhpcyByYXRoZXIgbG93IGRpc3BlcnNpb24gYXJvdW5kIHRoZSBtZWFuIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgdG90YWwgZGlzcGVyc2lvbiBiZWluZyBsb3csIHRvbywgYXMgdGhlIG1pbmltdW0gdmFsdWVzIGFyZSAzIGFuZCB0aGUgbWF4aW11bSB2YWx1ZXMgYXJlIDUuCgpJbiB0ZXJtcyBvZiBleHBsYWluYWJpbGl0eSAoRVgwMV9TQ09SRSksIGFsbCBtZWFucyBhcmUgcm91bmRlZCB0byAyIGV4Y2VwdCBmb3IgQ29UeFJBRyB3aGljaCBpcyByb3VuZGVkIHRvIDMuIEZvciBWYW5pbGxhIGFuZCBDb1QgdGhlIG1lYW4gcmVtYWlucyBhdCAyIGFjY29yZGluZyB0byB0aGVpciBsb3dlciBhbmQgdXBwZXIgY29uZmlkZW5jZSBpbnRlcnZhbHMuIEluIGNvbnRyYXN0LCB0aGUgbWVhbiBvZiBSQUcgY291bGQgaW5jcmVhc2UgdG8gMyBpbiBsaW5lIHdpdGggdGhlIHVwcGVyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2Yg4omIIDIuOTEgd2hpY2ggaXMgcm91bmRlZCB0byAzLiBJbiByZXZlcnNlIGZvciB0aGUgbWVhbiBvZiBDb1R4UkFHIHdoaWNoIGNvdWxkIGRlY3JlYXNlIHRvIDIgYWNjb3JkaW5nIHRvIGl0cyBsb3dlciBjb25maWRlbmNlIGludGVydmFsIG9mIDIuNDggcm91bmRlZCB0byAyLiBDb21wYXJlZCB0byB0aGUgb3RoZXIgZGVwZW5kZW50IHZhcmlhYmxlcywgdGhlIFNFcyBhcmUgdGhlIGhpZ2hlc3QgYW5kIHRodXMsIHRoZSBlc3RpbWF0ZXMgYXJlIHRoZSBtb3N0IGltcHJlY2lzZSBvbmUgZGVzcGl0ZSBhIHN0aWxsIGhpZ2ggcHJlY2lzaW9uICjiiYggMC4xNywg4omIIDAuMTMsIOKJiCAwLjIyLCDiiYggMC4xNykuIFRoZSBtZWRpYW4gYWdyZWVzIHdpdGggdGhlIG1lYW5zLCBpLmUuLCAyIGV4Y2VwdCBmb3IgQ29UeFJBRyB3aGljaCBpcyAzLiBXaGVyZWFzIHRoZSBtb2RlIHZhcmllcyBhcyB0aGUgbW9zdCBmcmVxdWVudCB2YWx1ZSBmb3IgVmFuaWxsYSwgQ29UIGFuZCBSQUcgaXMgMSBpbmRpY2F0aW5nIHRoYXQgdGhvc2UgdGhyZWUgYXJlIHZlcnkgbGlrZWx5IHRvIGJlIHBlcmNlaXZlZCB3aXRoIGEgbG93IGV4cGxhaW5hYmlsaXR5LiBJbiBjb250cmFzdCwgdGhlIG1vZGUgb2YgQ29UeFJBRyBpcyAzLCBpLmUuLCBhIG1vZGVyYXRlIGV4cGxhaW5hYmlsaXR5IGlzIGxpa2VseSB0byBiZSBwZXJjZWl2ZWQgYnkgdGhlIHJlc3BvbmRlbnRzLiBUaGUgU0QgaXMgbW9kZXJhdGVseSBoaWdoIHN0YXRpbmcgYSBkaXNwZXJzaW9uIGFyb3VuZCB0aGUgbWVhbiBvZiB1cCB0byBhIHJhdGluZyBkaWZmZXJlbmNlIG9mIDIsIGUuZy4sIGZvciBSQUcgd2l0aCBhIFNEIOKJiCAxLjIwIGluZGljYXRpbmcgYSBtYXhpbXVtIGRpc3BlcnNpb24gb2YgdmFsdWVzIHRvIHRoZSByYXRpbmcgb2YgNC4gQSBtb2RlcmF0ZWx5IGhpZ2ggU0QgaW5kaWNhdGVzIGEgd2l0aGluIGdyb3VwIGRpc2FncmVlbWVudCBhbmQgdGh1cywgYSBicm9hZCBkaXNwZXJzaW9uLiBUaGlzIGlzIHVuZGVycGlubmVkIGJ5IG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIHJhbmdpbmcgZnJvbSBhdCBsZWFzdCAxIHRvIDQuCgpUbyBzdW1tYXJpemUsIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIG9mIGFjY291bnRhYmlsaXR5IChBQzAxX1NDT1JFKSBhbmQgdXNlZnVsbmVzcyAoVUkwMV9TQ09SRSkgc2hhcmUgc2ltaWxhciBtZXRyaWMgdmFsdWVzIGFuZCBkaXNwZXJzaW9uIGZvciBhbGwgdHJlYXRtZW50cy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbGwgdHJlYXRtZW50cyBhcmUgbGlrZWx5IHRvIGJlIHBlcmNlaXZlZCB0aGUgc2FtZSBpbiB0ZXJtcyBvZiBhY2NvdW50YWJpbGl0eSBhbmQgdXNlZnVsbmVzcy4gQWx0aG91Z2gsIGZvciB0aGUgZGVwZW5kZW50IHZhcmlhYmxlcyBvZiBkaXNjbG9zdXJlIChESTAxX1NDT1JFKSBhbmQgZXhwbGFpbmFiaWxpdHkgKEVYMDFfU0NPUkUpIHRoZSBtZXRyaWNzIHZhcnkuIEF0IGEgZmlyc3QgZ2xhbmNlLCB0aGlzIGluZGljYXRlcyB0aGF0IGF0IGxlYXN0IENvVHhSQUcgYWNoaWV2ZXMgYSBoaWdoZXIgcmF0aW5nIHRoYW4gdGhlIG90aGVyIHRyZWF0bWVudHMgYW5kIHRodXMsIGlzIG1vcmUgbGlrZWx5IHRvIGJlIHBlcmNlaXZlZCBtb3JlIGRpc2Nsb3NpbmcgYW5kIGV4cGxhaW5hYmxlLiBUbyBmdXJ0aGVyIGVsYWJvcmF0ZSBvbiB0aGlzIGVmZmVjdCwgYSBNQU5PVkEgaXMgY29uZHVjdGVkIGluIHRoZSBmb2xsb3dpbmcuCgo8aDE+RmFjdG9yaWFsIE1BTk9WQTwvaDE+CldpdGggZmFjdG9yaWFsIE1BTk9WQSB0aGUgZm9sbG93aW5nIG51bGwgaHlwb3RoZXNpcyBhcmUgY2hlY2tlZCAoRnJpZWRyaWNoLCBLb25pZXRzY2hrZSBhbmQgUGF1bHksIDIwMTkpOgo8dWw+CjxsaT4KSDAxOiBGb3IgdGhlIG1haW4gZWZmZWN0czogdGhlIG1lYW4gdmVjdG9yIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIGlzIGVxdWFsIGFjcm9zcyBhbGwgZ3JvdXBzIG9mIGluZGVwZW5kZW50IHZhcmlhYmxlcywgaS5lLiB0aGUgdHJlYXRtZW50IGRvZXMgbm90IGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gYW55IGRpbWVuc2lvbiBvZiB0cmFuc3BhcmVuY3kuIFRoaXMgY2FuIGJlIGRldGFpbGVkIGludG8gdHdvIGh5cG90aGVzaXM6Cjx1bD4KPGxpPkgwMWE6IFRoZSBwb3N0LXRyYWluaW5nIHRyZWF0bWVudCBvZiBSQUcgZG9lcyBub3QgaGF2ZSBhIG11bHRpdmFyaWF0ZSBlZmZlY3Qgb24gYW55IGRpbWVuc2lvbiBvZiB0cmFuc3BhcmVuY3kuPC9saT4KPGxpPkgwMWI6IFRoZSBpbmZlcmVuY2UgdHJlYXRtZW50IG9mIENvVCBkb2VzIG5vdCBoYXZlIGEgbXVsdGl2YXJpYXRlIGVmZmVjdCBvbiBhbnkgZGltZW5zaW9uIG9mIHRyYW5zcGFyZW5jeS48L2xpPgo8L3VsPgo8L2xpPgo8bGk+SDAyOiBGb3IgdGhlIGludGVyYWN0aW9uIGVmZmVjdHM6IHRoZSBjb21iaW5hdGlvbiBvZiBpbmRlcGVuZGVudCB2YXJpYWJsZSBncm91cHMgZG9lcyBub3QgbGVhZCB0byBhbnkgYWRkaXRpb25hbCBlZmZlY3RzIGNvbXBhcmVkIHRvIHRoZWlyIHNpbmd1bGFyIGFwcGxpY2F0aW9uLCBpLmUuIHRoZSBjb21iaW5hdGlvbiBvZiB0cmVhdG1lbnRzIChDb1QgYW5kIFJBRykgaGFzIGFuIGVxdWFsIGVmZmVjdCBvbiBhbnkgZGltZW5zaW9uIG9mIHRyYW5zcGFyZW5jeSBhcyBpZiB0aGUgdHJlYXRtZW50cyB3ZXJlIGFwcGxpZWQgYWxvbmUuPC9saT4KPC91bD4KRm9yIGVhY2ggbnVsbCBoeXBvdGhlc2VzIGFuZCBmdXJ0aGVyIHN0YXRpc3RpY2FsIHRlc3QsIGEgc2lnbmlmaWNhbmNlIGxldmVsIGFscGhhIG9mIDAuMDUgaXMgYXNzdW1lZC4KClRvIGFsbG93IGZvciBhIGZhY3RvcmlhbCBNQU5PVkEgY2FsY3VsYXRpb24gd2l0aCBub24tYmluYXJ5IGZhY3RvciBsZXZlbHMgYXMgIlZhbmlsbGEiLCAiQ29UIiwgIlJBRyIsIGFuZCAiQ29UeFJBRyIsIGFuIGVuY29kaW5nIGludG8gYmluYXJ5IHZhcmlhYmxlcyBpcyBuZWNlc3NhcnkgKE5hdmFycm8gYW5kIEZveGNyb2Z0LCAyMDI1KS4gQXMgYSBjb25zZXF1ZW5jZSwgd2UgZGVmaW5lIHRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgdG8gcmVwcmVzZW50IHRoZSBmYWN0b3JpYWwgcmVzZWFyY2ggZGVzaWduOgo8dGFibGU+PHRoZWFkPgogIDx0cj4KICAgIDx0aCBjb2xzcGFuPSIyIiByb3dzcGFuPSIyIj48L3RoPgogICAgPHRoIGNvbHNwYW49IjIiPlBvc3QtVHJhaW5pbmc8L3RoPgogIDwvdHI+CiAgPHRyPgogICAgPHRoPlZhbmlsbGE8L3RoPgogICAgPHRoPlJBRzwvdGg+CiAgPC90cj48L3RoZWFkPgo8dGJvZHk+CiAgPHRyPgogICAgPHRoIHJvd3NwYW49IjIiPkluZmVyZW5jZTwvdGg+CiAgICA8dGg+VmFuaWxsYTwvdGg+CiAgICA8dGQ+MDA8L3RkPgogICAgPHRkPjAxPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0aD5Db1Q8L3RoPgogICAgPHRkPjEwPC90ZD4KICAgIDx0ZD4xMTwvdGQ+CiAgPC90cj4KPC90Ym9keT4KPC90YWJsZT4KQXMgb25seSBvbmUgaW5mZXJlbmNlIGFuZCBwb3N0LXRyYWluaW5nIG1ldGhvZCBpcyB0ZXN0ZWQgYXMgYSB0cmVhdG1lbnQsIHRoZSBmYWN0b3JzIGFyZSBuYW1lZCBhcyB0aGUgbWV0aG9kcyBub3QgYXMgdGhlIGFjdHVhbCBmYWN0b3JzLCBpLmUuLCBDb1QgYW5kIFJBRy4KClRvIGVzdGFibGlzaCB0aGlzIGNvZGluZywgdGhlIG1pZHMgb2JqZWN0IGlzIHRyYW5zZm9ybWVkIGludG8gbG9uZyBsaXN0IGNvbnNpc3Rpbmcgb2Ygc3RhY2tlZCByb3dzLCBpLmUuLCBpbnN0ZWFkIG9mIDEwIHNlcGFyYXRlIGRhdGFzZXRzLCBvbmUgZGF0YXNldCBleHBhbmRlZCBieSBhIGNvbHVtbiBpbmhlcml0aW5nIHRoZSBpbXB1dGF0aW9uIG51bWJlciBpcyBjcmVhdGVkIChWYW4gQnV1cmVuIGFuZCBHcm9vdGh1aXMtT3Vkc2hvb3JuLCAyMDExKS4gQWZ0ZXIgY29kaW5nLCB0aGUgc3RhY2tlZCBkYXRhc2V0IGlzIHRyYW5zZm9ybWVkIGJhY2sgaW50byBhIG1pZHMgb2JqZWN0IGZvciBmdXJ0aGVyIGFuYWx5c2lzLgoKYGBge3J9CmFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29sc19jb2RlZCA8LSBsYXBwbHkoYW5hbHlzaXNfbGlzdF9mYWN0b3JfbWVhbl9jb2xzLCBmdW5jdGlvbihkZikgewogICAgZGYgJT4lCiAgICAgICAgbXV0YXRlKAogICAgICAgIENvVCA9IGZhY3RvcihpZmVsc2UodHJlYXRtZW50ICVpbiUgYygiQ29UIiwgIkNvVHhSQUciKSwgMSwgMCksCiAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLCAxKSksCiAgICAgICAgUkFHID0gZmFjdG9yKGlmZWxzZSh0cmVhdG1lbnQgJWluJSBjKCJSQUciLCAiQ29UeFJBRyIpLCAxLCAwKSwKICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDEpKQogICAgICAgICl9KQoKYW5hbHlzaXNfbGlzdF9mYWN0b3JfbWVhbl9jb2xzX2NvZGVkWzFdCgojIFRyYW5zZm9ybWVkIGJhY2sgaW50byBhIG1pZHMKbWlkc19jb2RlZCA8LSBkYXRhbGlzdDJtaWRzKGFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29sc19jb2RlZCkKYGBgCgo8aDI+Q2hlY2tpbmcgQXNzdW1wdGlvbnMgb24gKE11bHRpdmFyaWF0ZSkgTm9ybWFsaXR5IGFuZCBIb21vc2NlZGFzdGljaXR5PC9oMj4gCkJlZm9yZSBzdGFydGluZyB0aGUgZmFjdG9yaWFsIE1BTk9WQSwgaXRzIHVuZGVybHlpbmcgYXNzdW1wdGlvbnMgb2Ygbm9ybWFsaXR5IGFuZCBob21vc2NlZGFzdGljaXR5IGFyZSByZXF1aXJlZCB0byBiZSBjaGVja2VkIG9uIHRoZSBiYXNpcyBvZiB0aGUgcHJpb3IgZW5jb2RlZCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKFN0w6VobGUgYW5kIFdvbGQsIDE5OTApLiBUaGUgYXNzdW1wdGlvbnMgb2YgaW5kZXBlbmRlbnQgb2JqZWN0cywgYW4gaW52ZXJ0aWJsZSBjb3ZhcmlhbmNlIG1hdHJpeCwgYW5kIG11bHRpY29sbGluZWFyaXR5IGFyZSBnaXZlbiBmb3IgYm90aCwgTUFOT1ZBIGFuZCBwb3N0LWhvYyBBTk9WQXMsIGFuZCB0aHVzLCBhcmUgbm90IGZ1cnRoZXIgZXZhbHVhdGVkIHdoaWNoIHN0YXRlZCBpbiBkZXRhaWwgd2l0aGluIHRoZSB0aGVzaXMgKFN0w6VobGUgYW5kIFdvbGQsIDE5OTA7IEthbmcgYW5kIEppbiwgMjAxNjsgQnJvd24sIDIwMTUpLgoKVGhlIGJhc2lzIGZvciB0aGUgZXZhbHVhdGlvbiBvZiBtdWx0aS0gYW5kIHVuaXZhcmlhdGUgbm9ybWFsaXR5IGlzIGxhaWQgYnkgdGhlIG51bGwgaHlwb3RoZXNpcyBvZiBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGRhdGEgc2FtcGxlIChTaGFwaXJvIGFuZCBXaWxrLCAxOTY1KS4gSGVuY2UsIHRoZSBhaW0gaXMgdG8gZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpczoKSDA6IFRoZSBkYXRhc2V0ICJpcyBhIHNhbXBsZSBmcm9tIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiIgKFNoYXBpcm8gYW5kIFdpbGssIDE5NjUsIHAuIDU5MikuCgpBcyBNQU5PVkEgYXMgYSBtdWx0aXZhcmlhdGUgYXBwcm9hY2ggaXMgY29uZHVjdGVkIGZpcnN0IChLYW5nIGFuZCBKaW4sIDIwMTYpLCB0aGUgbXVsdGl2YXJpYXRlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGlzIHRlc3RlZCBmaXJzdCwgdG9vLiBUaGVyZWZvcmUsIHRoZSBtdWx0aXZhcmlhdGUgc2tld25lc3MgYW5kIGt1cnRvc2lzIHRlc3Qgc3RhdGlzdGljcyBwcm9jZWR1cmUgb2YgTWFyZGlhICgxOTcwKSBpcyBhcHBsaWVkLiBTa2V3bmVzcyBhbmQga3VydG9zaXMgcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGVncmVlIG9mIGRldmlhdGlvbiBmcm9tIG11bHRpdmFyaWF0ZSBub3JtYWxpdHkgKEthbmcgYW5kIEppbiwgMjAxNikuIElmIGJvdGggc3RhdGlzdGljcyByZXN1bHQgaW4gcC12YWx1ZXMgcmVqZWN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMsIGEgbXVsdGl2YXJpYXRlIG5vbi1ub3JtYWxpdHkgaXMgYXNzdW1lZCAoWmhvdSBhbmQgU2hhbywgMjAxNDsgWmhhbmcsIFpob3UgYW5kIFNoYW8sIDIwMjUpLgoKVGhlIE1hcmRpYSB0ZXN0IGlzIGNvbmR1Y3RlZCBmb3IgdGhlIGRlcGVuZGVudCB2YXJpYWJsZXMgd2l0aGluIGFsbCBvZiB0aGUgMTAgaW1wdXRlZCBkYXRhc2V0cyBhcyBhIHN0YWNrZWQgZGF0YXNldCBjb250YWluaW5nIGFsbCAxMCBkYXRhc2V0cyBpbiBvbmUgd291bGQgYmx1cnJ5IHJlc3VsdHMuIEFzIGEgY29uc2VxdWVuY2UsIDEwIHRlc3Qgc3RhdGlzdGljIHJlc3VsdHMgYXJlIGV4cGVjdGVkLiBUaGUgZGVjaXNpb24gaXMgbWFkZSB0byBub3QgdGVzdCBtdWx0aXZhcmlhdGUgbm9ybWFsaXR5IHBlciB0cmVhdG1lbnQgZ3JvdXAgZHVlIHRvIGFuIGluY3JlYXNlZCBjb21wbGV4aXR5IG9mIGludGVycHJldGluZyA0MCBpbnN0ZWFkIG9mIDEwIHRlc3Qgc3RhdGlzdGljcy4KCmBgYHtyfQojbWFyZGlhX3Rlc3RfdHJlYXRtZW50IDwtIGxhcHBseShhbmFseXNpc19saXN0X2ZhY3Rvcl9tZWFuX2NvbHNfY29kZWQsICNmdW5jdGlvbihkZikgewojICBkZiAlPiUKIyAgZ3JvdXBfc3BsaXQodHJlYXRtZW50KSAlPiUKIyAgICBsYXBwbHkoZnVuY3Rpb24oLmdyb3VwKSAKIyAgICAgIG1hcmRpYSguZ3JvdXBbLCBjKCJBQzAxX1NDT1JFIiwgIkRJMDFfU0NPUkUiLCAiVUkwMV9TQ09SRSIsICJFWDAxX1NDT1JFIildKSRtdi50ZXN0CiMgICAgICApCiN9KQoKbWFyZGlhX3Rlc3QgPC0gbGFwcGx5KGFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29sc19jb2RlZCwgZnVuY3Rpb24oZGYpIHsKICAgICAgbWFyZGlhKGRmWywgYygiQUMwMV9TQ09SRSIsICJESTAxX1NDT1JFIiwgIlVJMDFfU0NPUkUiLCAiRVgwMV9TQ09SRSIpXSkkbXYudGVzdAp9KQoKbWFyZGlhX3Rlc3QKI21hcmRpYV90ZXN0X3RyZWF0bWVudApgYGAKCkFjcm9zcyBhbGwgMTAgdGVzdCBzdGF0aXN0aWNzIG11bHRpdmFyaWF0ZSBub24tbm9ybWFsaXR5IGlzIHByZXNlbnQgYXMgdGhlIHRoaXJkIHJvdydzICgiTVYgTm9ybWFsaXR5IikgaW5kaWNhdGVzIHdpdGhpbiB0aGUgZm91cnRoIGNvbHVtbiAoIlJlc3VsdCIpIHdpdGggYSAiTk8iIHZhbHVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHRlc3RzIGZvciBza2V3bmVzcyBhbmQga3VydG9zaXMgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhyb3VnaCBwLXZhbHVlcyA8IDAuMDUuIEV4Y2VwdCBmb3IgdGhlIGZpZnRoIHRlc3Qgc3RhdGlzdGljIG9mIHRoZSBmaWZ0aCBpbXB1dGVkIGRhdGFzZXQgaW4gd2hpY2ggdGhlIHRlc3Qgc3RhdGlzdGljIG9mIGt1cnRvc2lzIOKJiCAxLjk0LCBwLXZhbHVlIOKJiCAwLjA1MjQsIHJlc3VsdCA9IFlFUy4gQWx0aG91Z2gsIHRoZSBza2V3bmVzcyBsZWFkcyB0byB0aGUgb3ZlcmFyY2hpbmcgZmFpbHVyZSBvZiBhY2NlcHRpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyBmb3IgdGhlIGZpZnRoIGltcHV0ZWQgZGF0YXNldCBhcyB0aGUgc2tld25lc3Mgc3RhdGlzdGljIOKJiCA4Mi45MywgcC12YWx1ZSDiiYggMCwgcmVzdWx0ID0gTk8gYW5kIHRodXMsIHJlamVjdHMgdGhlIG51bGwgaHlwb3RoZXNpcy4gQXMgYWxsIGltcHV0ZWQgZGF0YXNldHMgZmFpbCBIMCwgd2Ugc3RhdGUgdGhhdCBhIG5vbi1ub3JtYWwgbXVsdGl2YXJpYXRlIGRpc3RyaWJ1dGlvbiBpcyBwcmV2YWxlbnQgZm9yIHRoZSBhdCBoYW5kIGRhdGEgc2FtcGxlIGNvbnNpc3Rpbmcgb2YgMTAgaW1wdXRlZCBkYXRhc2V0cy4gCgpUbyBmdXJ0aGVyIHZhbGlkYXRlIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiwgdGhlIHVuaXZhcmlhdGUgbm9ybWFsaXR5IG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIGlzIGV2YWx1YXRlZCB1c2luZyB0aGUgU2hhcGlybyBXaWxrIHRlc3QgKFNoYXBpcm8gYW5kIFdpbGssIDE5NjUpLiBXIHZhbHVlcyBjbG9zZSB0byAxIGluZGljYXRlIHRoZSBsaWtlbGlob29kIG9mIG5vcm1hbGl0eSBhbmQgVyB2YWx1ZXMgY2xvc2UgdG8gMCB0aGUgY29udHJhcnkgKFNoYXBpcm8gYW5kIFdpbGssIDE5NjUpLiBUaGUgU2hhcGlybyBXaWxrIHRlc3QgZm9yIG5vcm1hbGl0eSBpcyBjb25kdWN0ZWQgZm9yIGVhY2ggaW1wdXRlZCBkYXRhc2V0IGFzIGEgc3RhY2tlZCBkYXRhc2V0IGNvbnRhaW5pbmcgYWxsIDEwIGRhdGFzZXRzIGluIG9uZSB3b3VsZCBibHVycnkgcmVzdWx0cy4gTW9yZW92ZXIsIHVuaXZhcmlhdGUgbm9ybWFsaXR5IGlzIHRlc3RlZCBwZXIgdHJlYXRtZW50IGdyb3VwIGFzIEFOT1ZBIGFzc3VtZXMgbm9ybWFsaXR5IGZvciBhbGwgZGVwZW5kZW50IHZhcmlhYmxlcyBhY3Jvc3MgYWxsIGluZGVwZW5kZW50IHZhcmlhYmxlcy4gSW4gYWRkaXRpb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIGRhdGFzZXQgYXJlIGNhbGN1bGF0ZWQgYXMgbWVhbiBmb3IgaW50ZXJwcmV0YXRpb24gcHVycG9zZXMuCgpgYGB7cn0Kc2hhcGlyb193aWxrX3Rlc3RfbGlzdCA8LSBsYXBwbHkoYW5hbHlzaXNfbGlzdF9mYWN0b3JfbWVhbl9jb2xzX2NvZGVkLCBmdW5jdGlvbihkZikgewogIGRmICU+JQogICAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUKICAgICAgc2hhcGlyb190ZXN0KEFDMDFfU0NPUkUsIERJMDFfU0NPUkUsIFVJMDFfU0NPUkUsIEVYMDFfU0NPUkUpCn0pCgpzaGFwaXJvX3N0YWNrZWQgPC0gYmluZF9yb3dzKHNoYXBpcm9fd2lsa190ZXN0X2xpc3QpCgpzaGFwaXJvX3dpbGtfdGVzdF9hdmcgPC0gc2hhcGlyb19zdGFja2VkICU+JQogIGdyb3VwX2J5KHRyZWF0bWVudCwgdmFyaWFibGUpICU+JQogICAgc3VtbWFyaXNlKAogICAgICBtZWFuX3N0YXRpc3RpYyA9IG1lYW4oc3RhdGlzdGljKSwKICAgICAgbWVhbl9wID0gbWVhbihwKSwKICAgICAgLmdyb3VwcyA9ICJkcm9wIgogICAgKQoKc2hhcGlyb193aWxrX3Rlc3RfbGlzdApzaGFwaXJvX3dpbGtfdGVzdF9hdmcKYGBgCgpEZXNwaXRlIHByZWRvbWluYW50bHkgY2xvc2UgdG8gMSBtZWFuIFctdmFsdWVzLCBleGNlcHQgZm9yIFZhbmlsbGEgLSBESTAxX1NDT1JFIFcg4omIIDAuNjYsIHdlIG11c3QgcmVqZWN0IEgwIGZvciBhbGwgZGVwZW5kZW50IHZhcmlhYmxlcyBhcyB0aGUgbWVhbiBwLXZhbHVlcyBhcmUgPCAwLjA1LiBPbmx5IG9uZSB0cmVhdG1lbnQgLSB2YXJpYWJsZSBjb21iaW5hdGlvbiBmYWlscyB0byByZWplY3QgSDAgKENvVHhSQUcgLSBFWDAxX1NDT1JFIFcg4omIIDAuOTcpIHdpdGggYSBwLXZhbHVlIOKJiCAwLjU5LiBFeGFtaW5pbmcgdGhlIHRvdGFsIGxpc3Qgb2YgcmVzdWx0cywgaXQgYmVjb21lcyBhcHBhcmVudCB0aGF0IENvVHhSQUcgLSBFWDAxX1NDT1JFIFcg4omIIDAuOTcgY29uc2lzdGVudGx5IGZhaWxzIHRvIHJlamVjdCBIMCB3aXRoIGEgcC12YWx1ZSA8IDAuMDUuIE5ldmVydGhlbGVzcywgYXMgdGhlIG1ham9yaXR5IGZhaWxzIEgwLCB3ZSBzdGF0ZSB0aGF0IGEgbm9uLW5vcm1hbCB1bml2YXJpYXRlIGRpc3RyaWJ1dGlvbiBpcyBwcmV2YWxlbnQgZm9yIHRoZSBhdCBoYW5kIGRhdGEgc2FtcGxlIGNvbnNpc3Rpbmcgb2YgMTAgaW1wdXRlZCBkYXRhc2V0cy4gCgpFdmVuIHRob3VnaCBtdWx0aS0gYW5kIHVuaXZhcmlhdGUgbm9uLW5vcm1hbGl0eSBpcyBwcmVzZW50LCAoTSlBTk9WQSBjYW4gYmUgY29uZHVjdGVkIGR1ZSB0byB0aGVpciByb2J1c3RuZXNzIHRvIG5vbi1ub3JtYWxpdHkgZXNwZWNpYWxseSBpZiB0aGUgc2FtcGxlIGlzIGxhcmdlIChLYW5nIGFuZCBKaW4sIDIwMTYpLiBBcyB0aGUgZGF0YXNldCBvZiB0aGUgYXQgaGFuZCB0aGVzaXMgY29udGFpbnMgMTMxIHNhbXBsZXMgd2l0aCBhdCBsZWFzdCAyMCBwYXJ0aWNpcGFudHMgcGVyIGdyb3VwIHdoaWNoIGlzIGluIGxpbmUgd2l0aCB0aGUgcnVsZSBvZiB0aHVtYiBvZiBCaGF0dGFjaGVyamVlICgyMDEyKSwgdGhlIHNhbXBsZSBpcyBjb25zaWRlcmVkIGxhcmdlIGFuZCB0aHVzLCByb2J1c3QgYWdhaW5zdCBub24tbm9ybWFsaXR5LiBBbHRob3VnaCwgaXQgaGFzIHRvIGJlIG5vdGVkIHRoYXQgdGhlIGFwcGFyZW50IG5vbi1ub3JtYWxpdHkgbWlnaHQgaW5mbHVlbmNlIHRoZSBwb3dlciBvZiB0aGUgbGF0dGVyIChNKUFOT1ZBIHRlc3Qgc3RhdGlzdGljcywgZS5nLiwgV2lsaydzIGxhbWJkYSAoU3TDpWhsZSBhbmQgV29sZCwgMTk5MCkuIAoKQW5vdGhlciBhc3N1bXB0aW9uIHJlbGllcyB3aXRoaW4gaG9tb3NjZWRhc3RpY2l0eS9ob21vZ2VuZWl0eSBvZiAoY28tKXZhcmlhbmMgZXdoaWNoIGlzIGV4cGxhaW5lZCBhcyBhIOKAnGNvbnN0YW50IGVycm9yIHZhcmlhbmNlIiAoVm9uIEV5ZSBhbmQgV2llZGVybWFubiwgMjAyMywgcC4gMTMwKS4gRm9yIE1BTk9WQSwgdGhlIEJveCBNIHRlc3QgaXMgc3VnZ2VzdGVkIHRvIHZhbGlkYXRlIHRoZSDigJxtdWx0aXZhcmlhdGUgaG9tb2dlbmVpdHkgb2YgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXjigJ0gKEthbmcgYW5kIEppbiwgMjAxNiwgcC4gNCksIGkuZS4sIHRoYXQgdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGVxdWFscyBhY3Jvc3MgdHJlYXRtZW50cyAoS2FuZyBhbmQgSmluLCAyMDE2KS4gVGh1cywgdGhlIG51bGwgaHlwb3RoZXNpcyB3ZSBhaW0gdG8gZmFpbCB0byByZWplY3QgaXM6IApIMDogQWxsIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIGhhdmUgZXF1YWwgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaWNlcy4KClRoZSBCb3gtTSB0ZXN0IGlzIGNvbmR1Y3RlZCBmb3IgZWFjaCBpbXB1dGVkIGRhdGFzZXQ6CgpgYGB7cn0KYm94X21fdGVzdCA8LSBsYXBwbHkoYW5hbHlzaXNfbGlzdF9mYWN0b3JfbWVhbl9jb2xzX2NvZGVkLCBmdW5jdGlvbihkZikgewogIHJlc3VsdCA8LSBib3hNKGRmWywgYygiQUMwMV9TQ09SRSIsICJESTAxX1NDT1JFIiwgIlVJMDFfU0NPUkUiLCAiRVgwMV9TQ09SRSIpXSwgZ3JvdXAgPSBkZiR0cmVhdG1lbnQpCn0pCgpib3hfbV90ZXN0CmBgYAoKVGhlIEJveC1NIHRlc3RzIG9mIGFsbCAxMCBpbXB1dGVkIGRhdGFzZXRzIHJlcG9ydCBhIGNoaS1zcXVhcmUgc3RhdGlzdGljIG9mIGNsb3Nlc3QgdG8gYWNjZXB0aW5nIGZvciB0aGUgZWlnaHRoIGltcHV0ZWQgZGF0YXNldCB3aXRoIGEgY2hpLXNxdWFyZSDiiYggNTkuNDgzIG9uIDMwIGRmIGFuZCBhIHAtdmFsdWUg4omIIDAuMDAxMDYzLiBOZXZlcnRoZWxlc3MsIHRoaXMgcC12YWx1ZSBzdGlsbCBsZWFkcyB0byByZWplY3RpbmcgdGhlIEgwLiBBbHRob3VnaCwgaWYgdGhlIHNpZ25pZmljYW5jZSBsZXZlbCBpcyBzZXQgdG8gMC4wMDEsIEgwIHdvdWxkIG5vdCBiZSByZWplY3RlZCBmb3IgdGhpcyBkYXRhc2V0LiBIb3dldmVyLCBhcyBhbGwgdGhlIG90aGVyIHRlc3Qgc3RhdGlzdGljcyBkaXNwbGF5IGV2ZW4gbW9yZSBub24tc2lnbmlmaWNhbnQgdmFsdWVzLCB0aGUgYXQgaGFuZCBCb3gtTSB0ZXN0IGluZGljYXRlcyBhIGhldGVyb2dlbmVpdHkgb2YgdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4ZXMgYW5kIHRodXMsIGEgY2F1dGlvdXMgaW50ZXJwcmV0YXRpb24gb2YgTUFOT1ZBIHRlc3Qgc3RhdGlzdGljcyBpcyBuZWNlc3NhcnkgKERlbmlzLCAyMDIwKS4KCkFzIHdpdGggdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGV2YWx1YXRpb24sIHRoZSB1bml2YXJpYXRlIGFzc3VtcHRpb24gb2YgaG9tb2dlbmVpdHkgb2YgdmFyaWFuY2VzIGlzIGV2YWx1YXRlZCBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIHBvc3QtaG9jIEFOT1ZBcyB1c2luZyBMZXZlbmXigJlzIHRlc3QuIFRoaXMgdGVzdCBhaW1zIHRvIHZhbGlkYXRlIHRoZSBudWxsIGh5cG90aGVzaXMgb2Y6CkgwOiBBbGwgaW5kZXBlbmRlbnQgZ3JvdXBzIG9mIGFuIGRlcGVuZGVudCB2YXJpYWJsZSBoYXZlIGVxdWFsIHZhcmlhbmNlcyAoS2FsdGVuYmFjaCwgMjAyMSkuCgpgYGB7cn0KbGV2ZW5lX3Rlc3QgPC0gbGFwcGx5KGFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29sc19jb2RlZCwgZnVuY3Rpb24oZGYpewogIG1hcF9kZihjKCJBQzAxX1NDT1JFIiwgIkRJMDFfU0NPUkUiLCAiVUkwMV9TQ09SRSIsICJFWDAxX1NDT1JFIiksIGZ1bmN0aW9uKGRlcF92YXIpewogICAgcmVzdWx0IDwtIGxldmVuZVRlc3QoYXMuZm9ybXVsYShwYXN0ZShkZXBfdmFyLCAifiB0cmVhdG1lbnQiKSksIGRhdGEgPSBkZikKICB9KQp9KQoKbGV2ZW5lX3Rlc3QKYGBgCgpJbiBjb250cmFzdCB0byB0aGUgbXVsdGl2YXJpYXRlIHRlc3Qgc3RhdGlzdGljcywgdGhlIHVuaXZhcmlhdGUgSDAgaXMgbGlrZWx5IHRvIGJlIGFjY2VwdGVkLiBBcyBldmVuIHRoZSB0ZXN0IHN0YXRpc3RpYyByZXN1bHQgd2hvc2UgcC12YWx1ZSBpcyBjbG9zZXN0IHRvIDAsIHBvaW50cyBvbiBhY2NlcHRpbmcgSDAuIFRoaXMgdGVzdCBzdGF0aXN0aWMgZm9yIHRoZSB0ZW50aCBpbXB1dGVkIGRhdGFzZXQncyBncm91cCA3IHdoaWNoIGlzIHRoZSBncm91cCBDb1R4UkFHIHdpdGggMyBkZiAoYXMgYWxsIG90aGVyIHRlc3Qgc3RhdGlzdGljcykgYW5kIGFuIEYtdmFsdWUg4omIIDEuODM3MSBmb2xsb3dlZCBieSBhIHAtdmFsdWUg4omIIDAuMTQzNy4gSGVuY2UsIHRoZSBjb25jbHVzaW9uIGlzIG1hZGUgdGhhdCBIMCBpcyBsaWtlbHkgdG8gYmUgYWNjZXB0ZWQgdGhhdCBhbGwgdmFyaWFuY2VzIGFyZSBob21vZ2VuZW91cyBmb3IgYSBzaWduaWZpY2FuY2UgdmFsdWUgb2YgMC4wNS4gVGhpcyBpcyBmdXJ0aGVyIHJlaW5mb3JjZWQgYnkgdGhlIHByaW9yIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgd2hpY2ggYWxyZWFkeSBpbmRpY2F0ZWQgb25seSBhIG1pbm9yIGRpZmZlcmVuY2UgaW4gdmFyaWFuY2UgYW1vbmcgdGhlIGluZGVwZW5kZW50IGdyb3Vwcy4KCjxoMj5Ud28td2F5IE1BTk9WQTwvaDI+ClRoZSBhcHBsaWVkIHNlcXVlbmNlIG9mIHdvcmsgYWxpZ25zIHRvIHRoZSBwcm9wb3NhbCBvZiBLYW5nIGFuZCBKaW4gKDIwMTYpIG9uIGhvdyB0byBwcm9jZWVkIHdpdGggZmFjdG9yaWFsIE1BTk9WQS4gVGhpcyBwcm9wb3NhbCBhbmQgdGhlIGF0IGhhbmQgZmluZGluZ3MgbGVkIHRvIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CjxvbD4KPGxpPkZhY3RvcmlhbCBNQU5PVkEsPC9saT4KPGxpPkZhY3RvcmlhbCBBTk9WQSw8L2xpPgo8bGk+UG9zdC1ob2MgZmFjdG9yaWFsIEFOT1ZBIG1haW4gZWZmZWN0IGFuYWx5c2lzIChLYW5nIGFuZCBKaW4sIDIwMTYpLjwvbGk+Cjwvb2wKCk9uIHRoZSBiYXNpcyBvZiB0aGUgcHJpb3IgYW5hbHlzaXMsIHdlIGNhbiBhc3N1bWUgYSBub24tbm9ybWFsaXR5IGFuZCBoZXRlcm9nZW5laXR5IGZvciB0aGUgYXQgaGFuZCB1bmJhbGFuY2VkIGRhdGEgc2FtcGxlIGNvbnNpc3Rpbmcgb2YgMTAgaW1wdXRlZCBkYXRhc2V0cy4gQWdhaW5zdCB0aGlzIGJhY2tncm91bmQsIGEgdGVzdCBzdGF0aXN0aWMgZm9yIHRoZSBmb2xsb3dpbmcgdHdvLXdheSBNQU5PVkEgbXVzdCBiZSBzZWxlY3RlZCBvdXQgb2YgZm91ciBwb3RlbnRpYWwgdGVzdCBzdGF0aXN0aWNzOiBSb3nigJlzIGxhcmdlc3Qgcm9vdCwgSG90ZWxsaW5n4oCZcyB0cmFjZSwgV2lsa+KAmXMgbGFtYmRhLCBQaWxsYWnigJlzIHRyYWNlIChLYW5nIGFuZCBKaW4sIDIwMTYpLgoKUGlsbGFp4oCZcyB0cmFjZSBpcyBjaG9zZW4gYXMgYSB0ZXN0IHN0YXRpc3RpYyBmb3IgdGhlIGF0IGhhbmQgdHdvLXdheSBNQU5PVkEuIEl0IHJldmVhbHMgdG8gYmUgdGhlIGFwcHJvcHJpYXRlIGZpdCBpbiBsaW5lIHdpdGggdGhlIGxpdGVyYXR1cmUgZmluZGluZ3Mgd2l0aGluIHRoZSB0aGVzaXMgYW5kIHRoZSBzdGF0aXN0aWNhbCByZXN1bHRzIHNvIGZhci4KClRoZSBtb2RlbCBpcyBjb25zdHJ1Y3RlZCBvbiB0aGUgYmFzaXMgb2YgdGhlIHR3byBmYWN0b3JzOiBpbmZlcmVuY2UgYW5kIHBvc3QtdHJhaW5pbmcgd2hpY2ggYXJlIHRyYW5zZm9ybWVkIGluIGxpbmUgd2l0aCB0aGVpciB0d28tbGV2ZWxzIGVhY2ggLSBpbmNsdWRpbmcgVmFuaWxsYSAtIGludG8gQ29UIGFuZCBSQUcuIFRodXMsIHRoZSBtb2RlbCB0byBiZSBldmFsdWF0ZWQgaXM6CgpBQzAxX1NDT1JFLCBESTAxX1NDT1JFLCBVSTAxX1NDT1JFLCBFWDAxX1NDT1JFICg9ZGltZW5zaW9ucykgPSBncmFuZCBtZWFuICg9SW50ZXJjZXB0IHdoaWNoIGluY2x1ZGVzIFZhbmlsbGEpICsgQ29UICsgUkFHICsgQ29UICogUkFHICsgcmVzaWR1YWwgZXJyb3IuCgpUaGlzIG1vZGVsIGlzIGNvbnN0cnVjdGVkIGFjY29yZGluZyB0byBaaGFuZyAoMjAxMSkgd2hvIGFsc28gY29uZHVjdGVkIGEgdHdvLXdheSBNQU5PVkEuIFRoZSB0d28td2F5IE1BTk9WQSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBtYW5vdmEoKSBmdW5jdGlvbiBvZiB0aGUgUiBidWlsdC1pbiBzdGF0cyBwYWNrYWdlLiBUaGUgbWFub3ZhKCkgaW1wbGljaXRseSBpbmNsdWRlcyBtb3N0IHBhcnRzIG9mIGEgbW9kZWwgc2ltaWxhcmx5IGFzIHRoZSBhb3YoKS9hbm92YSgpIGZ1bmN0aW9uIGxlYWRpbmcgdG8gYSBzaW1wbGlmaWVkIG1vZGVsIG9mICJkaW1lbnNpb24ocykgPSBDb1QgKiBSQUciIChLYWx0ZW5iYWNoLCAyMDIxKS4gCgpUaGUgdHdvLXdheSBNQU5PVkEgaXMgY29uZHVjdGVkIG9uIHRoZSBiYXNpcyBvZiBhIG1pZHMgb2JqZWN0IHdoaWNoIGNhcHR1cmVzIHRoZSB1bmNlcnRhaW50eSBvZiB0aGUgaW1wdXRhdGlvbiBwcm9jZXNzIHN1ZmZpY2llbnRseSB3aXRoaW4gdGhlIE1BTk9WQSBhbmFseXNpcyAoVmFuIEJ1dXJlbiBhbmQgR3Jvb3RodWlzLU91ZHNob29ybiwgMjAxMSk6CgpgYGB7cn0KbWFub3ZhX2ZpdCA8LSB3aXRoKG1pZHNfY29kZWQsIG1hbm92YShjYmluZChBQzAxX1NDT1JFLCBESTAxX1NDT1JFLCBVSTAxX1NDT1JFLCBFWDAxX1NDT1JFKSB+IENvVCAqIFJBRykpCgptYW5vdmFfbW9kZWwgPC0gc3VtbWFyeShtYW5vdmFfZml0LCB0ZXN0ID0gYygiUGlsbGFpIikpCm1hbm92YV9tb2RlbApgYGAKCkZvciBpbnRlcnByZXRhdGlvbiBwdXJwb3NlcywgdGhlIEYtc3RhdGlzdGljIChjb2x1bW46ICJzdGF0aXN0aWMiKSBpcyBwb29sZWQgYXMgYSBtaXBvIG9iamVjdCBmb3IgYWxsIGZhY3RvciBsZXZlbHMsIGkuZS4sIENvVCwgUkFHLCBhbmQgdGhlIGludGVyYWN0aW9uIENvVDpSQUcgYW5kIGNvbWJpbmVkIGFzIGFuIG1pcmEgb2JqZWN0IGluIGxpbmUgd2l0aCBWYW4gQnV1cmVuIGFuZCBHcm9vdGh1aXMtT3Vkc2hvb3JuICgyMDExKToKCmBgYHtyfQojIEV4dHJhY3QgYWxsIEYtc3RhdGlzdGljcyBmb3IgZWFjaCBsZXZlbCBhbmQgY29tYmluYXRpb24sIGkuZS4sIDEwIEYtc3RhdGlzdGljIHZhbHVlcyBmb3IgZWFjaCB0cmVhdG1lbnQKbWFub3ZhX3N0YXRzX0NvVCA8LSBtYXBfZGJsKG1hbm92YV9maXQkYW5hbHlzZXMsIH57dGlkeSgueCkkc3RhdGlzdGljWzFdfSkKbWFub3ZhX3N0YXRzX1JBRyA8LSBtYXBfZGJsKG1hbm92YV9maXQkYW5hbHlzZXMsIH57dGlkeSgueCkkc3RhdGlzdGljWzJdfSkKbWFub3ZhX3N0YXRzX0NvVHhSQUcgPC0gbWFwX2RibChtYW5vdmFfZml0JGFuYWx5c2VzLCB+e3RpZHkoLngpJHN0YXRpc3RpY1szXX0pCgojIFBvb2wgdGhlIEYtc3RhdGlzdGljIGJhc2VkIG9uIFJ1YmluJ3MgcnVsZXMKcG9vbGVkX0Zfc3RhdHNfQ29UIDwtIG1pY29tYmluZS5GKG1hbm92YV9zdGF0c19Db1QsIGRmID0gMTApCnBvb2xlZF9GX3N0YXRzX1JBRyA8LSBtaWNvbWJpbmUuRihtYW5vdmFfc3RhdHNfUkFHLCBkZiA9IDEwKQpwb29sZWRfRl9zdGF0c19Db1R4UkFHIDwtIG1pY29tYmluZS5GKG1hbm92YV9zdGF0c19Db1R4UkFHLCBkZiA9IDEwKQpgYGAKCkZvciB2aXN1YWxpemF0aW9uIGFuZCBpbnRlcnByZXRhdGlvbiBwdXJwb3NlcywgdGhlIHZhbHVlcyBhcmUgZGVwaWN0ZWQgd2l0aGluIGEgTUFOT1ZBLWxpa2UgdGFibGUgYXMgZm9sbG93czoKCmBgYHtyfQojIENvbWJpbmUgcG9vbGVkIHJlc3VsdHMgd2l0aGluIGEgdGFibGUKcG9vbGVkX21hbm92YV9Db1QgPC0gZGF0YS5mcmFtZSh0ZXJtID0gYygiQ29UIikpCnBvb2xlZF9tYW5vdmFfUkFHIDwtIGRhdGEuZnJhbWUodGVybSA9IGMoIlJBRyIpKQpwb29sZWRfbWFub3ZhX0NvVHhSQUcgPC0gZGF0YS5mcmFtZSh0ZXJtID0gYygiQ29UOlJBRyIpKQoKIyBUcmFuc3BvbmUgcG9vbGVkIHN0YXRzCnBvb2xlZF9GX3N0YXRzX0NvVF9kZiA8LSB0KGFzLmRhdGEuZnJhbWUocG9vbGVkX0Zfc3RhdHNfQ29UKSkKcG9vbGVkX0Zfc3RhdHNfUkFHX2RmIDwtIHQoYXMuZGF0YS5mcmFtZShwb29sZWRfRl9zdGF0c19SQUcpKQpwb29sZWRfRl9zdGF0c19Db1R4UkFHX2RmIDwtIHQoYXMuZGF0YS5mcmFtZShwb29sZWRfRl9zdGF0c19Db1R4UkFHKSkKCiMgQ29tYmluZSB0cmFuc3BvbmVkLCBwb29sZWQgc3RhdHMgd2l0aCBwcmVwcmludApwb29sZWRfbWFub3ZhIDwtIGJpbmRfcm93cyhiaW5kX2NvbHMocG9vbGVkX21hbm92YV9Db1QsIHBvb2xlZF9GX3N0YXRzX0NvVF9kZiksIGJpbmRfY29scyhwb29sZWRfbWFub3ZhX1JBRywgcG9vbGVkX0Zfc3RhdHNfUkFHX2RmKSwgYmluZF9jb2xzKHBvb2xlZF9tYW5vdmFfQ29UeFJBRywgcG9vbGVkX0Zfc3RhdHNfQ29UeFJBR19kZikpCgpwb29sZWRfbWFub3ZhIDwtIHBvb2xlZF9tYW5vdmEgJT4lCiAgcmVuYW1lKAogICAgc3RhdGlzdGljID0gRAogICkKCnBvb2xlZF9tYW5vdmEKYGBgCgpUaGUgcG9vbGVkIE1BTk9WQSByZXN1bHRzIGluZGljYXRlIHNvbGV5IHNpZ25pZmljYW50IG1haW4gZWZmZWN0cyBhbmQgbm8gc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gZWZmZWN0IGFjY29yZGluZyB0byBhIHNpZ25pZmljYW5jZSBsZXZlbCBhbHBoYSA9IDAuMDUuIEZvciBDb1QsIGEgcG9vbGVkIEYoMTAsIDY3OCkg4omIIDEuODU1OCwgcCDiiYggMC4wNDgzIGluZGljYXRlcyBhIHNpZ25pZmljYW50IG1haW4gZWZmZWN0IHJlamVjdGluZyB0aGUgSDAxYiBsZWFkaW5nIHRvIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIENvVCB0cmVhdG1lbnQgaGFzIGEgbXVsdGl2YXJpYXRlIGVmZmVjdCBvbiB0aGUgZGltZW5zaW9ucyBvZiB0cmFuc3BhcmVuY3kuIEZvciBSQUcsIGEgcG9vbGVkIEYoMTAsIDEwKSDiiYggMjMuNjEwMiwgcCA8IDAuMDAwMSBpbmRpY2F0ZXMgYSBzaWduaWZpY2FudCBtYWluIGVmZmVjdCByZWplY3RpbmcgdGhlIEgwMWEgbGVhZGluZyB0byB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBSQUcgdHJlYXRtZW50IGhhcyBhbiBldmVuIHN0cm9uZ2VyIG11bHRpdmFyaWF0ZSBlZmZlY3Qgb24gdGhlIGRpbWVuc2lvbnMgb2YgdHJhbnNwYXJlbmN5LiBBcyB0aGUgaW50ZXJhY3Rpb24gQ29UOlJBRyB3aXRoIEYoMTAsIDExNCkg4omIIDAuNDMzNiwgcCDiiYggMC45MjczIGluZGljYXRlcyBubyBzaWduaWZpY2FudCBpbnRlcmFjdGlvbiBlZmZlY3QsIHRoZSB0ZXN0IGZhaWxzIHRvIHJlamVjdCBIMDIuIFRoaXMgaW5kaWNhdGVzIHRoYXQgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIENvVCBlbmhhbmNlZCBieSBSQUcgbGVhZHMgbm8gc3luZXJneSBlZmZlY3RzIGluIGltcHJvdmluZyB0cmFuc3BhcmVuY3kuIAoKVGhlIGxhdHRlciBvYnNlcnZhdGlvbiBsZWFkcyB0byBhIGZhY3RvcmlhbCBBTk9WQSBmb3IgZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUsIGkuZS4sIHRyYW5zcGFyZW5jeSBkaW1lbnNpb24sIGluIGxpbmUgd2l0aCB0aGUgd29ya2Zsb3cgb2YgS2FuZyBhbmQgSmluICgyMDE2KS4KCjxoMj5GYWN0b3JpYWwgQU5PVkE8L2gyPgpUaGUgZmFjdG9yaWFsIEFOT1ZBcyBhcmUgYXBwbGllZCB0byBhbGwgaW1wdXRlZCBkYXRhIGFzIHdpdGggZmFjdG9yaWFsIE1BTk9WQSAoUnViaW4sIDE5ODc7IFZhbiBCdXVyZW4gYW5kIEdyb290aHVpcy1PdWRzaG9vcm4sIDIwMTEpLiBDb250cmFyeSB0byBNQU5PVkEsIG5vdCBvbmx5IHRoZSBGLXN0YXRpc3RpY3MgYXJlIHBvb2xlZCwgYnV0IHdob2xlIEFOT1ZB4oCZcyBhcmUgcG9vbGVkIHVzaW5nIGEgYnVpbHQtY2FwYWJpbGl0eSBvZiB0aGUgbWljZWFkZHMgcGFja2FnZSBpbiBSIChSb2JpdHpzY2gsIEdydW5kIGFuZCBIZW5rZSwgMjAyNSkuIFRoaXMgYWxsb3dzIHRvIHVzZSB0aGUgdHlwZSBJSSBzdW0gb2Ygc3F1YXJlcyBtZXRob2QgZm9yIHRoZSBwb29sZWQgQU5PVkEgY2FsY3VsYXRpb24gKFJvYml0enNjaCwgR3J1bmQgYW5kIEhlbmtlLCAyMDI1KS4gVGhlIHBvb2xpbmcgYWxzbyBkZWxpdmVycyB0aGUgZWZmZWN0IHNpemUgbWVhc3VyZXMgKHBhcnRpYWwpIGV0YSBzcXVhcmVkIGJhc2VkIG9uIHRoZSB2YXJpYW5jZSBleHBsYWluZWQgKHIgc3F1YXJlZCkgKFJvYml0enNjaCwgR3J1bmQgYW5kIEhlbmtlLCAyMDI1KS4gQWx0aG91Z2gsIHNvbGVseSB0aGUgcGFydGlhbCBldGEgc3F1YXJlZCBtZXRyaWMgaXMgZXhhbWluZWQgKEthbHRlbmJhY2gsIDIwMjEpLgoKYGBge3J9CiMgTGlzdGVkIEFOT1ZBUyBhY3Jvc3MgYWxsIGltcHV0ZWQgZGF0YXNldHMKYW5vdmFfZml0X2xpc3RfYWMgPC0gd2l0aChtaWRzX2NvZGVkLCBhbm92YShsbShBQzAxX1NDT1JFIH4gQ29UICogUkFHKSkpCmFub3ZhX2ZpdF9saXN0X2RpIDwtIHdpdGgobWlkc19jb2RlZCwgYW5vdmEobG0oREkwMV9TQ09SRSB+IENvVCAqIFJBRykpKQphbm92YV9maXRfbGlzdF91aSA8LSB3aXRoKG1pZHNfY29kZWQsIGFub3ZhKGxtKFVJMDFfU0NPUkUgfiBDb1QgKiBSQUcpKSkKYW5vdmFfZml0X2xpc3RfZXggPC0gd2l0aChtaWRzX2NvZGVkLCBhbm92YShsbShFWDAxX1NDT1JFIH4gQ29UICogUkFHKSkpCgpzdW1tYXJ5KGFub3ZhX2ZpdF9saXN0X2FjKQpzdW1tYXJ5KGFub3ZhX2ZpdF9saXN0X2RpKQpzdW1tYXJ5KGFub3ZhX2ZpdF9saXN0X3VpKQpzdW1tYXJ5KGFub3ZhX2ZpdF9saXN0X2V4KQoKIyBQb29sZWQgQU5PVkFTCnBvb2xlZF9hbm92YV9maXRfYWMgPC0gbWkuYW5vdmEobWkucmVzID0gbWlkc19jb2RlZCwgZm9ybXVsYSA9ICJBQzAxX1NDT1JFIH4gQ29UICogUkFHIiwgdHlwZSA9IDIpCnBvb2xlZF9hbm92YV9maXRfZGkgPC0gbWkuYW5vdmEobWkucmVzID0gbWlkc19jb2RlZCwgZm9ybXVsYSA9ICJESTAxX1NDT1JFIH4gQ29UICogUkFHIiwgdHlwZSA9IDIpCnBvb2xlZF9hbm92YV9maXRfdWkgPC0gbWkuYW5vdmEobWkucmVzID0gbWlkc19jb2RlZCwgZm9ybXVsYSA9ICJVSTAxX1NDT1JFIH4gQ29UICogUkFHIiwgdHlwZSA9IDIpCnBvb2xlZF9hbm92YV9maXRfZXggPC0gbWkuYW5vdmEobWkucmVzID0gbWlkc19jb2RlZCwgZm9ybXVsYSA9ICJFWDAxX1NDT1JFIH4gQ29UICogUkFHIiwgdHlwZSA9IDIpCgojIFItc3F1YXJlZCB2YWx1ZXMgZm9yIGVhY2ggcG9vbGVkIEFOT1ZBIHRhYmxlCnByaW50KHBvb2xlZF9hbm92YV9maXRfYWMkci5zcXVhcmVkKQpwcmludChwb29sZWRfYW5vdmFfZml0X2RpJHIuc3F1YXJlZCkKcHJpbnQocG9vbGVkX2Fub3ZhX2ZpdF91aSRyLnNxdWFyZWQpCnByaW50KHBvb2xlZF9hbm92YV9maXRfZXgkci5zcXVhcmVkKQpgYGAKClRoZSBmYWN0b3JpYWwgQU5PVkFzJyByZXN1bHRzIGFyZSBzdG9yZWQgd2l0aGluIHRoZSBmb2xsb3dpbmcgdGFibGVzIHdoaWNoIHNlcnZlIGFzIGEgZm91bmRhdGlvbiBmb3IgdGhlIGludGVycHJldGF0aW9uLCByZXNwZWN0aXZlbHkuCgpgYGB7cn0KIyBTdW1tYXJ5IHRhYmxlcwphbm92YV9hYyA8LSBkYXRhX2ZyYW1lKAogIEFDMDEgPSBjKCJDb1QiLCAiUkFHIiwgIkNvVDpSQUciLCAiUmVzaWR1YWwiKQopCmFub3ZhX2FjIDwtIGJpbmRfY29scyhhbm92YV9hYywgcG9vbGVkX2Fub3ZhX2ZpdF9hYykKYW5vdmFfYWMgPC0gYW5vdmFfYWNbLCBjKDEsIDMsIDQsIDUsIDYsIDcsIDIsIDgsIDksIDEwKV0KCmFub3ZhX2RpIDwtIGRhdGFfZnJhbWUoCiAgREkwMSA9IGMoIkNvVCIsICJSQUciLCAiQ29UOlJBRyIsICJSZXNpZHVhbCIpCikKYW5vdmFfZGkgPC0gYmluZF9jb2xzKGFub3ZhX2RpLCBwb29sZWRfYW5vdmFfZml0X2RpKQphbm92YV9kaSA8LSBhbm92YV9kaVssIGMoMSwgMywgNCwgNSwgNiwgNywgMiwgOCwgOSwgMTApXQoKYW5vdmFfdWkgPC0gZGF0YV9mcmFtZSgKICBVSTAxID0gYygiQ29UIiwgIlJBRyIsICJDb1Q6UkFHIiwgIlJlc2lkdWFsIikKKQphbm92YV91aSA8LSBiaW5kX2NvbHMoYW5vdmFfdWksIHBvb2xlZF9hbm92YV9maXRfdWkpCmFub3ZhX3VpIDwtIGFub3ZhX3VpWywgYygxLCAzLCA0LCA1LCA2LCA3LCAyLCA4LCA5LCAxMCldCgphbm92YV9leCA8LSBkYXRhX2ZyYW1lKAogIEVYMDEgPSBjKCJDb1QiLCAiUkFHIiwgIkNvVDpSQUciLCAiUmVzaWR1YWwiKQopCmFub3ZhX2V4IDwtIGJpbmRfY29scyhhbm92YV9leCwgcG9vbGVkX2Fub3ZhX2ZpdF9leCkKYW5vdmFfZXggPC0gYW5vdmFfZXhbLCBjKDEsIDMsIDQsIDUsIDYsIDcsIDIsIDgsIDksIDEwKV0KCmFub3ZhX2FjCmFub3ZhX2RpCmFub3ZhX3VpCmFub3ZhX2V4CmBgYAoKRm9yIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgb2YgYWNjb3VudGFiaWxpdHkgKEFDMDFfU0NPUkUpLCBvbmx5IHRoZSBtYWluIGVmZmVjdCBvZiBDb1QgaXMgbGlrZWx5IHRvIGJlIHNpZ25pZmljYW50IHdpdGggRigxLCAxMDM3NSkg4omIIDQuNzc5OSwgcCDiiYggMC4wMjg4LCBwYXJ0aWFsLmV0YTIg4omIIDAuMDM3NjguIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIENvVCB0cmVhdG1lbnQgaXMgbGlrZWx5IHRvIGluZmx1ZW5jZSB0aGUgYWNjb3VudGFiaWxpdHkgZGltZW5zaW9uIG9mIHRyYW5zcGFyZW5jeSB3aXRoIGEgZGlmZmVyZW50IG1lYW4gY29tcGFyZWQgdG8gdGhlIG90aGVyIGdyb3Vwcy4gQWx0aG91Z2gsIHRoZSBsb3cgcGFydGlhbC5ldGEyIHZhbHVlIG9mIOKJiCAzLjggJSBwb2ludHMgdG8gYSBsb3cgaW1wYWN0IG9mIHRoZSB0cmVhdG1lbnQncyBjaGFyYWN0ZXJpc3RpY3Mgb24gdGhlIG92ZXJhbGwgdmFyaWF0aW9uIG9mIHRoZSBkaW1lbnNpb24uIFRoZSBoaWdoIHN1bSBvZiBzcXVhcmVkIGVycm9ycyBmb3IgdGhlIHJlc2lkdWFsIGluZGljYXRlcyBvbmx5IHNsaWdodCBkaWZmZXJlbmNlcyBhbW9uZyB0cmVhdG1lbnQgZ3JvdXBzLgoKRm9yIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgb2YgZGlzY2xvc3VyZSAoREkwMV9TQ09SRSksIG9ubHkgdGhlIG1haW4gZWZmZWN0IG9mIFJBRyBpcyBsaWtlbHkgdG8gYmUgc2lnbmlmaWNhbnQgd2l0aCBGKDEsIDU5KSDiiYggMTY0Ljc0NTMsIHAgPCAwLjAwMDEsIHBhcnRpYWwuZXRhMiDiiYggMC42Nzk2MjEuIFRoZXNlIG1ldHJpY3MgaW5kaWNhdGUgdGhhdCB0aGUgbWVhbiB2YWx1ZSBvZiBSQUcgdmFyaWVzIHNpZ25pZmljYW50bHkgY29tcGFyZWQgdG8gdGhlIG90aGVyIHRyZWF0bWVudHMuIE1vcmVvdmVyLCB0aGUgUkFHIHRyZWF0bWVudCBjYW4gYmUgZXhwZWN0ZWQgdG8gaW5mbHVlbmNlIHRoZSBkaW1lbnNpb24gb2YgZGlzY2xvc3VyZSBoZWF2aWx5IHdoaWNoIGlzIHVuZGVycGlubmVkIGJ5IHJlbGF0aXZlbHkgaGlnaCBwYXJ0aWFsLmV0YTIgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpbiDiiYggNjguMCAlIHRoZSBvdmVyYWxsIHZhcmlhdGlvbiBvZiB0aGUgZGltZW5zaW9uIGlzIGltcGFjdGVkIGJ5IFJBRy4KCkZvciB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIG9mIHVzZWZ1bG5lc3Mgb2YgaW5mb3JtYXRpb24gKFVJMDFfU0NPUkUpIG5vIHNpZ25pZmljYW50IGVmZmVjdCBpcyBkZXRlY3RlZC4gSG93ZXZlciwgYXMgdGhlIHJlc2lkdWFsIHN1bSBvZiBzcXVhcnJlZCBlcnJvcnMgaXMgaGlnaGVyIHRoYW4gZm9yIGVhY2ggZWZmZWN0IHRoZSB2YXJpYXRpb24gb2YgdGhpcyBkaW1lbnNpb24gcmVtYWlucyB1bmV4cGxhaW5lZCBhbmQgZm9yIHRoaXMgZGltZW5zaW9uIHRoZXJlIGFyZSBubyBkaWZmZXJlbmNlcyB0aGF0IGNhbiBiZSBhcHBvaW50ZWQgdG93YXJkcyBhbnkgdHJlYXRtZW50IGdyb3VwIChLYWx0ZW5iYWNoLCAyMDIxKS4KCkZvciB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIG9mIGV4cGxhaW5hYmlsaXR5IChFWDAxX1NDT1JFKSwgUkFHIHJldmVhbHMgbGlrZWx5IHRvIGJlIHRoZSBvbmx5IHNpZ25pZmljYW50IG1haW4gZWZmZWN0IGFnYWluIHdpdGggRigxLCAzMjI1NSkg4omIIDEzLjY3NzAsIHAg4omIIDAuMDAwMiwgcGFydGlhbC5ldGEyIOKJiCAwLjA5ODkuIFRoaXMgaW5kaWNhdGVzIGEgZGlmZmVyZW50IG1lYW4gZm9yIFJBRyBhbmQgYW4gaW1wYWN0IG9mIOKJiCA5LjkgJSBhY2NvcmRpbmcgdG8gcGFydGlhbC5ldGEyIG9uIHRoaXMgZGltZW5zaW9uJ3MgdmFyaWF0aW9uLiBUaGUgaGlnaCBzdW0gb2Ygc3F1YXJlZCBlcnJvcnMgZm9yIHRoZSByZXNpZHVhbCBpbmRpY2F0ZXMgb25seSBzbGlnaHQgZGlmZmVyZW5jZXMgYW1vbmcgdHJlYXRtZW50IGdyb3Vwcy4KCkFzIHRoZSBtYWluIGVmZmVjdHMgcmVwZWF0ZWRseSBwcm92ZWQgbGlrZWx5IHRvIGJlIHJlc3BvbnNpYmxlIGZvciB0aGUgZGlmZmVyZW5jZXMgaW4gdmFyaWF0aW9ucyBvZiBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZSBleGNlcHQgZm9yIHVzZWZ1bG5lc3Mgb2YgaW5mb3JtYXRpb24gKFVJMDFfU0NPUkUpLCBhIHBvc3QtaG9jIGFuYWx5c2lzIG9mIG1haW4gZWZmZWN0IGNvbnRyYXN0cyBpcyBjb25kdWN0ZWQuCgo8aDM+UG9zdC1Ib2MgTWFpbiBFZmZlY3QgQ29udHJhc3RzPC9oMz4KVG8gdmVyaWZ5IHRoZSBwcmlvciByZXN1bHRzLCBhIHBvc3QtaG9jIG1haW4gZWZmZWN0IGNvbnRyYXN0IGFuYWx5c2lzIGlzIGNvbmR1Y3RlZC4gSW4gY29udHJhc3QgdG8gdGhlIGJlZm9yZWhhbmQgYW5hbHlzaXMsIHRoZSBsaW5lYXIgY29udHJhc3RzIGFuYWx5c2lzIHByb3ZpZGVzIGEgZGV0YWlsZWQgdmlldyBvbiBob3cgdGhlIG1haW4gZWZmZWN0cyBkaWZmZXIuIFRoZSBmb3VuZGF0aW9uIGZvciBjb250cmFzdCBhbmFseXNpcyBpcyBzZXQgdGhyb3VnaCB0aGUgY2FsY3VsYXRpb24gb2YgZXN0aW1hdGVkIG1hcmdpbmFsIG1lYW5zLiAoS2FsdGVuYmFjaCwgMjAyMSkKCkluIGxpbmUgd2l0aCBLYWx0ZW5iYWNoICgyMDIxKSB0aGUgZnVsbCBtb2RlbCBmb3IgZWFjaCBkaW1lbnNpb246ICJBQzAxX1NDT1JFIHwgREkwMV9TQ09SRSB8IFVJMDFfU0NPUkUgfCBFWDAxX1NDT1JFIH4gQ29UICsgUkFHICsgQ29UICogUkFHIiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSByZXNwZWN0aXZlIGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucy4gTW9yZW92ZXIsIHRoZSBwcmlvciBzZXQgY29kaW5nIGlzIHJldXNlZCBhZ2FpbiBmb3IgdGhlIHRoZSBjYWxjdWxhdGlvbnMuIER1ZSB0byB0aGUgdW5iYWxhbmNlZCBzZXR0aW5nLCBLYW5nIGFuZCBKaW4gKDIwMTYpIHN1Z2dlc3QgdG8gdXNlIHRoZSBtZXRob2QgYnkgU2lkYWsgdG8gYWRqdXN0IHJlc3BlY3RpdmUgY29uZmlkZW5jZSBpbnRlcnZhbHMuCgpgYGB7cn0KbW9kZWxfYWMgPC0gd2l0aChtaWRzX2NvZGVkLCBsbShBQzAxX1NDT1JFIH4gQ29UICsgUkFHICsgQ29UICogUkFHKSkKbW9kZWxfZGkgPC0gd2l0aChtaWRzX2NvZGVkLCBsbShESTAxX1NDT1JFIH4gQ29UICsgUkFHICsgQ29UICogUkFHKSkKbW9kZWxfdWkgPC0gd2l0aChtaWRzX2NvZGVkLCBsbShVSTAxX1NDT1JFIH4gQ29UICsgUkFHICsgQ29UICogUkFHKSkKbW9kZWxfZXggPC0gd2l0aChtaWRzX2NvZGVkLCBsbShFWDAxX1NDT1JFIH4gQ29UICsgUkFHICsgQ29UICogUkFHKSkKCiMgTGF5IHRoZSBmb3VuZGF0aW9uIGZvciBlc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbnMgY2FsY3VsYXRpb24gLSBjaGVjayBpdCBvbmNlCnJlZmVyZW5jZSA8LSByZWZfZ3JpZChtb2RlbF9hYykKcmVmZXJlbmNlCgojIENhbGN1bGF0ZSBlc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbnMgb24gdGhlIGJhc2lzIG9mIHRoZSByZWZlcmVuY2UKZXN0aW1hdGVkX21hcmdpbmFsX21lYW5zX2FjIDwtIGVtbWVhbnMobW9kZWxfYWMsIH4gQ29UICsgUkFHICsgQ29UICogUkFHLCBhZGp1c3QgPSAic2lkYWsiKQplc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfZGkgPC0gZW1tZWFucyhtb2RlbF9kaSwgfiBDb1QgKyBSQUcgKyBDb1QgKiBSQUcsIGFkanVzdCA9ICJzaWRhayIpCmVzdGltYXRlZF9tYXJnaW5hbF9tZWFuc191aSA8LSBlbW1lYW5zKG1vZGVsX3VpLCB+IENvVCArIFJBRyArIENvVCAqIFJBRywgYWRqdXN0ID0gInNpZGFrIikKZXN0aW1hdGVkX21hcmdpbmFsX21lYW5zX2V4IDwtIGVtbWVhbnMobW9kZWxfZXgsIH4gQ29UICsgUkFHICsgQ29UICogUkFHLCBhZGp1c3QgPSAic2lkYWsiKQoKIyBPdXRwdXQKZXN0aW1hdGVkX21hcmdpbmFsX21lYW5zX2FjCmVzdGltYXRlZF9tYXJnaW5hbF9tZWFuc19kaQplc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfdWkKZXN0aW1hdGVkX21hcmdpbmFsX21lYW5zX2V4CmBgYAoKQXMgdGhlIG1lYW5zIGhhdmUgYWxyZWFkeSBiZWVuIGludGVycHJldGVkIHdpdGhpbiB0aGUgZGVzY3JpcHRpdmUgYW5hbHlzaXMsIHRoZXNlIG9ic2VydmF0aW9ucyBzb2xlbHkgc2VydmUgYXMgYSBmb3VuZGF0aW9uIGZvciB0aGUgY29udHJhc3QgYW5hbHlzaXMgdGhhdCBmb2xsb3dzLiBGb3IgZWFjaCBjb250cmFzdCBhIHR3by1zaWRlZCB0LXRlc3QgY29tYmluZWQgd2l0aCBhIHJlc3VsdGluZyBwLXZhbHVlIGlzIGNhbGN1bGF0ZWQuIFRoZSBvdmVyYXJjaGluZyBnb2FsIG9mIHRoZSBtYWluIGVmZmVjdCBjb250cmFzdCBhbmFseXNpcyBpcyB0byB2ZXJpZnkgcHJpb3IgRi10ZXN0IHJlc3VsdHMgb2YgKE0pQU5PVkEgYW5kIHRvIHNob3cgdGhlIGRlZ3JlZSBvZiBkaWZmZXJlbmNlIG9mIHJlc3BlY3RpdmUgbWFpbiBlZmZlY3RzIHRvIG90aGVyIHRyZWF0bWVudCBncm91cHMuIFRodXMsIHRoZSBhaW0gaXMgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXM6CkgwOiBBbGwgY29udHJhc3RzID0gMC4gCkZvciBhZGp1c3RpbmcgdGhlIHAtdmFsdWVzIHRvIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHNhbXBsZSBhbmQgdG8gcG9zdC1ob2MgdGVzdGluZywgdGhlIFNjaGVmZmUgY29ycmVjdGlvbiBpcyB1c2VkLiAoS2FsdGVuYmFjaCwgMjAyMSkKCk9ubHkgdGhlIGFscmVhZHkgYWZ0ZXIgdGhlIHByaW9yIGFuYWx5c2lzIGxpa2VseSBlZmZlY3RzIGFyZSBleGFtaW5lZC4gRXhjZXB0IGZvciB0aGUgY2FzZSB0aGF0IGEgbmV3IGVmZmVjdCByZXZlYWxzIHRvIGJlIHNpZ25pZmljYW50LiAgCgpgYGB7cn0KY29udHJhc3RzX2V4YW1pbmVkIDwtIGxpc3QoCiAgIlZhbmlsbGEgdnMuIENvVCIgPSBjKDEsIC0xLCAwLCAwKSwKICAiVmFuaWxsYSB2cy4gUkFHIiA9IGMoMSwgMCwgLTEsIDApLAogICJDb1QgKEluZmVyZW5jZSkgdnMuIFJBRyAoUG9zdC1UcmFpbmluZykiID0gYygwLCAxLCAtMSwgMCkKKQoKIyBDYWxjdWxhdGUgbWFpbiBlZmZlY3QgY29udHJhc3RzCm1haW5fZWZmZWN0X2NvbnRyYXN0c19hYyA8LSBjb250cmFzdChlc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfYWMsIG1ldGhvZCA9IGNvbnRyYXN0c19leGFtaW5lZCwgYWRqdXN0ID0gInNjaGVmZmUiKQptYWluX2VmZmVjdF9jb250cmFzdHNfZGkgPC0gY29udHJhc3QoZXN0aW1hdGVkX21hcmdpbmFsX21lYW5zX2RpLCBtZXRob2QgPSBjb250cmFzdHNfZXhhbWluZWQsIGFkanVzdCA9ICJzY2hlZmZlIikKbWFpbl9lZmZlY3RfY29udHJhc3RzX3VpIDwtIGNvbnRyYXN0KGVzdGltYXRlZF9tYXJnaW5hbF9tZWFuc191aSwgbWV0aG9kID0gY29udHJhc3RzX2V4YW1pbmVkLCBhZGp1c3QgPSAic2NoZWZmZSIpCm1haW5fZWZmZWN0X2NvbnRyYXN0c19leCA8LSBjb250cmFzdChlc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfZXgsIG1ldGhvZCA9IGNvbnRyYXN0c19leGFtaW5lZCwgYWRqdXN0ID0gInNjaGVmZmUiKQoKIyBBZGQgdC10ZXN0cywgcC12YWx1ZXMsIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCm1haW5fZWZmZWN0X2NvbnRyYXN0c19hY19yZXMgPC0gc3VtbWFyeSgKICBtYWluX2VmZmVjdF9jb250cmFzdHNfYWMsCiAgaW5mZXIgPSBjKFRSVUUsIFRSVUUpCiAgKQptYWluX2VmZmVjdF9jb250cmFzdHNfZGlfcmVzIDwtIHN1bW1hcnkoCiAgbWFpbl9lZmZlY3RfY29udHJhc3RzX2RpLCAKICBpbmZlciA9IGMoVFJVRSwgVFJVRSkKICApCm1haW5fZWZmZWN0X2NvbnRyYXN0c191aV9yZXMgPC0gc3VtbWFyeSgKICBtYWluX2VmZmVjdF9jb250cmFzdHNfdWksIAogIGluZmVyID0gYyhUUlVFLCBUUlVFKQogICkKbWFpbl9lZmZlY3RfY29udHJhc3RzX2V4X3JlcyA8LSBzdW1tYXJ5KAogIG1haW5fZWZmZWN0X2NvbnRyYXN0c19leCwgCiAgaW5mZXIgPSBjKFRSVUUsIFRSVUUpCiAgKQoKIyBEaXNwbGF5IGNvbnRyYXN0cwptYWluX2VmZmVjdF9jb250cmFzdHNfYWNfcmVzCm1haW5fZWZmZWN0X2NvbnRyYXN0c19kaV9yZXMKbWFpbl9lZmZlY3RfY29udHJhc3RzX3VpX3JlcwptYWluX2VmZmVjdF9jb250cmFzdHNfZXhfcmVzCmBgYAoKRm9yIHRoZSBhY2NvdW50YWJpbGl0eSBkaW1lbnNpb24gKEFDMDFfU0NPUkUpLCB0aGUgbWFpbiBlZmZlY3Qgb2YgQ29UIGlzIGV4YW1pbmVkLiBUaGUgcG9zdC1ob2MgYW5hbHlzaXMgZm9yIGFjY291bnRhYmlsaXR5IHJldmVhbHMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBWYW5pbGxhIGFuZCBDb1QsIHAg4omIIDAuNjA3NyAobWVhbl9kaWZmIOKJiCAwLjE2ODAsIDk1JS1DSVstMC4yNDgsIDAuNTg1XSkgYW5kIGJldHdlZW4gQ29UIGFuZCBSQUcsIHAg4omIIDAuNDExMiAobWVhbl9kaWZmIOKJiCAtMC4yMzc0LCA5NSUtQ0lbLTAuNjc3LCAwLjIwMl0pLiBDb25zZXF1ZW50bHksIHRoZSBhc3N1bXB0aW9uIG9mIGxpa2VseSBzaWduaWZpY2FudCBDb1QgbWFpbiBlZmZlY3QgZm9yIGFjY291bnRhYmlsaXR5IGlzIHdpdGhkcmF3biBkdWUgdG8gYSBsaWtlbHkgbm9uLXNpZ25pZmljYW5jZSByZXZlYWxlZCB0aHJvdWdoIGNvbnRyYXN0IGFuYWx5c2lzIGRlc3BpdGUgYSBsaWtlbHkgcmVqZWN0aW9uIG9mIHRoZSBudWxsIGh5cG90aGVzaXMuCgpIb3dldmVyLCB0aGUgbWFpbiBlZmZlY3Qgb2YgUkFHIGZvciB0aGUgZGltZW5zaW9uIG9mIGRpc2Nsb3N1cmUgKERJMDFfU0NPUkUpIGlzIGxpa2VseSB0byBiZSB2ZXJpZmllZCBieSBjb250cmFzdCBhbmFseXNpcy4gVGhpcyBpcyBkdWUgdG8gYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gVmFuaWxsYSBhbmQgUkFHLCBwIDwgMC4wMDAxIChtZWFuX2RpZmYg4omIIC0yLjQ5OCwgOTUlLUNJWy0zLjA0NSwgLTEuOTUxXSkgYW5kIGJldHdlZW4gQ29UIGFuZCBSQUcsIHAgPCAwLjAwMDEgKG1lYW5fZGlmZiDiiYggLTIuMzgyLCA5NSUtQ0lbLTIuOTA3LCAtMS44NTddKS4gVGhvc2UgdmFsdWVzIGluZGljYXRlIHRoYXQgdGhlIGVzdGltYXRlZCBtZWFuIGRpZmZlcnMg4omIIDIgcmF0aW5ncyBiZXR3ZWVuIFJBRyBhbmQgdGhlIG90aGVyIHR3byB0cmVhdG1lbnQgZ3JvdXBzIHdpdGhpbiB0aGUgdXBwZXIgQ0kgZXZlbiBhcm91bmQgMyBwb2ludHMuIEl0IGhhcyB0byBiZSBub3RlZCB0aGF0IHRoZSBoaWdoZXIgU0VzIG9mIGRpc2Nsb3N1cmUgY29tcGFyZWQgdG8gdGhlIFNFcyBvZiBhY2NvdW50YWJpbGl0eSBhbmQgdXNlZnVsbmVzcyBvZiBpbmZvcm1hdGlvbiBsZWFkIHRvIGluY3JlYXNlZCBDSXMuIE5ldmVydGhlbGVzcywgYW5kIHVuZGVycGlubmVkIGJ5IHRoZSBwcmlvciBkZXNjcmlwdGl2ZSBhbmFseXNpcywgdGhlIG1haW4gZWZmZWN0IG9mIFJBRyBpcyB2ZXJpZmllZCB0byBiZSBsaWtlbHkgc2lnbmlmaWNhbnQuIENvbnNlcXVlbnRseSwgdGhlIG51bGwgaHlwb3RoZXNpcyBpcyByZWplY3RlZC4KCkZvciB1c2VmdWxuZXNzIG9mIGluZm9ybWF0aW9uIChVSTAxX1NDT1JFKSwgdGhlIG5vbi1zaWduaWZpY2FuY2Ugb2YgYWxsIHRyZWF0bWVudCBncm91cHMgaXMgbGlrZWx5IHRvIGJlIGFzc3VtZWQuIEFuIGV4YW1wbGUgZm9yIHRoaXMgaXMgdGhlIG5vbi1zaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gVmFuaWxsYSBhbmQgQ29ULCBwIOKJiCAwLjk5MjUgKG1lYW5fZGlmZiDiiYggLTAuMDE3MSwgOTUlLUNJWy0wLjM2MiwgMC4zMjhdKS4gTmV2ZXJ0aGVsZXNzLCB0aGUgbnVsbCBoeXBvdGhlc2lzIGlzIHJlamVjdGVkLgoKRm9yIHRoZSBleHBsYWluYWJpbGl0eSBkaW1lbnNpb24gKEVYMDFfU0NPUkUpLCB0aGUgc2lnbmlmaWNhbmNlIGFzc3VtcHRpb24gb2YgUkFHIGlzIGxpa2VseSB0byBiZSBkZWNsaW5lZCBvbiB0aGUgYmFzaXMgb2YgdGhlIGNvbnRyYXN0IGFuYWx5c2lzJyByZXN1bHRzLiBUaGUgcG9zdC1ob2MgYW5hbHlzaXMgZm9yIGV4cGxhaW5hYmlsaXR5IHNob3dzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldHdlZW4gVmFuaWxsYSBhbmQgUkFHLCBwIOKJiCAwLjE2NzMgKG1lYW5fZGlmZiDiiYggLTAuNDc0MCwgOTUlLUNJWy0xLjA5MSwgMC4xNDNdKSBhbmQgYmV0d2VlbiBDb1QgYW5kIFJBRywgcCDiiYggMC4xMjUxIChtZWFuX2RpZmYg4omIIC0wLjUwNjEsIDk1JS1DSVstMS4xMTYsIDAuMTA0XSkuIFRoZSBoaWdoZXN0IFNFcyBjb21wYXJlZCB0byB0aGUgb3RoZXIgZGVwZW5kZW50IHZhcmlhYmxlcycgU0VzIGxlYWQgdG8gYnJvYWQgQ0lzIHRoYXQgbWlnaHQgaW5kaWNhdGUgcG90ZW50aWFsIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLCBlLmcuLCBkaWZmZXJlbmNlcyBvZiAxIHJhdGluZyBwb2ludCBmb3IgUkFHIGNvbXBhcmVkIHRvIG90aGVyIHRyZWF0bWVudCBncm91cHMuIER1ZSB0byB0aGUgaGlnaCBTRXMgdGhlc2UgQ0kgdmFsdWVzIGNhbiBiZSBuZWdsZWN0ZWQuIFRoZSBwcmV2aW91c2x5IGFzIGxpa2VseSByZWNvZ25pemVkIHNpZ25pZmljYW50IGVmZmVjdCBvZiBSQUcgb24gdGhlIGRpbWVuc2lvbiBvZiBleHBsYWluYWJpbGl0eSBpcyBsaWtlbHkgdG8gYmUgbm9uLXNpZ25pZmljYW50LiBUaGUgbnVsbCBoeXBvdGhlc2lzIGlzIHJlamVjdGVkLgoKVG8gY29uY2x1ZGUgYWZ0ZXIgYWxsIG9ic2VydmF0aW9ucywgb25seSB0aGUgbWFpbiBlZmZlY3Qgb2YgUkFHIGZvciB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIG9mIGRpc2Nsb3N1cmUgKERJMDFfU0NPUkUpIHNob3dlZCBhIG1vZGVyYXRlIGxpa2VsaWhvb2Qgb2Ygc2lnbmlmaWNhbmNlLiBXaGVyZWFzIG1haW4gZWZmZWN0cyB0aGF0IHdlcmUgcGVyY2VpdmVkIGxpa2VseSBzaWduaWZpY2FudCBhZnRlciBmYWN0b3JpYWwgQU5PVkEgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIG5vbi1zaWduaWZpY2FudCwgaS5lLiwgbWFpbiBlZmZlY3Qgb2YgQ29UIG9uIGFjY291bnRhYmlsaXR5IGFuZCBtYWluIGVmZmVjdCBvZiBSQUcgb24gZXhwbGFpbmFiaWxpdHkuIEZvciB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIG9mIHVzZWZ1bG5lc3Mgb2YgaW5mb3JtYXRpb24gbm8gc2lnbmlmaWNhbnQgZWZmZWN0cyBzZWVtZWQgdG8gYmUgcHJldmFsZW50IHdoaWNoIHJlZmVycyB0byBuZWdsaWdpYmxlIGRpZmZlcmVuY2VzIGJldHdlZW4gZWFjaCB0cmVhdG1lbnRzJyBlZmZlY3RzLiAKClRoZSBhdCBoYW5kIHJlc3VsdHMgbGF5cyB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIGRpc2N1c3Npb24gd2l0aGluIHRoZSB0aGVzaXMuCgo8aDE+U2F2ZSBSZXN1bHRzPC9oMT4KCmBgYHtyfQpzdW1fb2ZfYWxsX3NhdmUgPC0gc2F2ZShzdW1fb2ZfYWxsLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL3N1bV9vZl9hbGwuUkRhdGEiKQpkZXNjcmlwdGl2ZV9zdGF0c19zYXZlIDwtIHNhdmUoZGVzY3JpcHRpdmVfc3RhdHMsIGZpbGUgPSAiTUFOT1ZBX3N0b3JhZ2UvZGVzY3JpcHRpdmVfc3RhdHMuUkRhdGEiKQphbmFseXNpc19saXN0X2ZhY3Rvcl9tZWFuX2NvbHNfY29kZWRfc2F2ZSA8LSBzYXZlKGFuYWx5c2lzX2xpc3RfZmFjdG9yX21lYW5fY29sc19jb2RlZCwgZmlsZSA9ICJNQU5PVkFfc3RvcmFnZS9hbmFseXNpc19saXN0X2ZhY3Rvcl9tZWFuX2NvbHNfY29kZWQuUkRhdGEiKQptYW5vdmFfbW9kZWxfc2F2ZSA8LSBzYXZlKG1hbm92YV9tb2RlbCwgZmlsZSA9ICJNQU5PVkFfc3RvcmFnZS9tYW5vdmFfbW9kZWwuUkRhdGEiKQpwb29sZWRfbWFub3ZhX3NhdmUgPC0gc2F2ZShwb29sZWRfbWFub3ZhLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL3Bvb2xlZF9tYW5vdmEuUkRhdGEiKQphbm92YV9maXRfbGlzdF9hY19zYXZlIDwtIHNhdmUoYW5vdmFfZml0X2xpc3RfYWMsIGZpbGUgPSAiTUFOT1ZBX3N0b3JhZ2UvYW5vdmFfZml0X2xpc3RfYWMuUkRhdGEiKQphbm92YV9maXRfbGlzdF9kaV9zYXZlIDwtIHNhdmUoYW5vdmFfZml0X2xpc3RfZGksIGZpbGUgPSAiTUFOT1ZBX3N0b3JhZ2UvYW5vdmFfZml0X2xpc3RfZGkuUkRhdGEiKQphbm92YV9maXRfbGlzdF91aV9zYXZlIDwtIHNhdmUoYW5vdmFfZml0X2xpc3RfdWksIGZpbGUgPSAiTUFOT1ZBX3N0b3JhZ2UvYW5vdmFfZml0X2xpc3RfdWkuUkRhdGEiKQphbm92YV9maXRfbGlzdF9leF9zYXZlIDwtIHNhdmUoYW5vdmFfZml0X2xpc3RfZXgsIGZpbGUgPSAiTUFOT1ZBX3N0b3JhZ2UvYW5vdmFfZml0X2xpc3RfZXguUkRhdGEiKQpwb29sZWRfYW5vdmFfZml0X2FjX3NhdmUgPC0gc2F2ZShwb29sZWRfYW5vdmFfZml0X2FjLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL3Bvb2xlZF9hbm92YV9maXRfYWMuUkRhdGEiKQpwb29sZWRfYW5vdmFfZml0X2RpX3NhdmUgPC0gc2F2ZShwb29sZWRfYW5vdmFfZml0X2RpLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL3Bvb2xlZF9hbm92YV9maXRfZGkuUkRhdGEiKQpwb29sZWRfYW5vdmFfZml0X3VpX3NhdmUgPC0gc2F2ZShwb29sZWRfYW5vdmFfZml0X3VpLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL3Bvb2xlZF9hbm92YV9maXRfdWkuUkRhdGEiKQpwb29sZWRfYW5vdmFfZml0X2V4X3NhdmUgPC0gc2F2ZShwb29sZWRfYW5vdmFfZml0X2V4LCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL3Bvb2xlZF9hbm92YV9maXRfZXguUkRhdGEiKQplc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfYWNfc2F2ZSA8LSBzYXZlKGVzdGltYXRlZF9tYXJnaW5hbF9tZWFuc19hYywgZmlsZSA9ICJNQU5PVkFfc3RvcmFnZS9lc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfYWMuUkRhdGEiKQplc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfZGlfc2F2ZSA8LSBzYXZlKGVzdGltYXRlZF9tYXJnaW5hbF9tZWFuc19kaSwgZmlsZSA9ICJNQU5PVkFfc3RvcmFnZS9lc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfZGkuUkRhdGEiKQplc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfdWlfc2F2ZSA8LSBzYXZlKGVzdGltYXRlZF9tYXJnaW5hbF9tZWFuc191aSwgZmlsZSA9ICJNQU5PVkFfc3RvcmFnZS9lc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfdWkuUkRhdGEiKQplc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfZXhfc2F2ZSA8LSBzYXZlKGVzdGltYXRlZF9tYXJnaW5hbF9tZWFuc19leCwgZmlsZSA9ICJNQU5PVkFfc3RvcmFnZS9lc3RpbWF0ZWRfbWFyZ2luYWxfbWVhbnNfZXguUkRhdGEiKQptYWluX2VmZmVjdF9jb250cmFzdHNfYWNfcmVzX3NhdmUgPC0gc2F2ZShtYWluX2VmZmVjdF9jb250cmFzdHNfYWNfcmVzLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL21haW5fZWZmZWN0X2NvbnRyYXN0c19hY19yZXMuUkRhdGEiKQptYWluX2VmZmVjdF9jb250cmFzdHNfZGlfcmVzX3NhdmUgPC0gc2F2ZShtYWluX2VmZmVjdF9jb250cmFzdHNfZGlfcmVzLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL21haW5fZWZmZWN0X2NvbnRyYXN0c19kaV9yZXMuUkRhdGEiKQptYWluX2VmZmVjdF9jb250cmFzdHNfdWlfcmVzX3NhdmUgPC0gc2F2ZShtYWluX2VmZmVjdF9jb250cmFzdHNfdWlfcmVzLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL21haW5fZWZmZWN0X2NvbnRyYXN0c191aV9yZXMuUkRhdGEiKQptYWluX2VmZmVjdF9jb250cmFzdHNfZXhfcmVzX3NhdmUgPC0gc2F2ZShtYWluX2VmZmVjdF9jb250cmFzdHNfZXhfcmVzLCBmaWxlID0gIk1BTk9WQV9zdG9yYWdlL21haW5fZWZmZWN0X2NvbnRyYXN0c19leF9yZXMuUkRhdGEiKQpgYGAKCgo8aDE+TGF0ZXggRXhwb3J0czwvaDE+CgpgYGB7cn0KCmBgYAoKCg==